问题
我需要编写一个正则表达式,以匹配结构为 {A/B} 的字符串中的以下要求。
要求/条件:
- A 和 B 只能是 [UGWRB] 之一。
- 未出现 U 或 G 的结构无效。
- 两个字符相等的结构无效。
- U 或 G 必须在组合中至少出现一次。
- 该结构可以重复或继续无限次,只要后面的每个实例在单独读取时仍然有效。 (请参阅下面的有效匹配)
有效匹配:
- {U/G}{U/G}{U/G}
- {W/G}{U/B}
- {U/G}{U/B}
- {U/G}
- {G/U}
- {U/B}
- ...
无效匹配:
- {U/U}{U/U}
- {U/U}{G/G}
- {U/G}{U/U}
- {U/G}{R/B}
- {G/G}
- {R/B}
- {W/R}
- {黑白}
- ...
我的尝试
这是我到目前为止所得到的,但是在 UGWRB 的所有组合中,我只得到了 14 个匹配中的 8 个。
{([UG])(?(1)|\w)\/(?(1)\w|[UG])}
最佳答案
为了完成任务,您必须使用否定和肯定的前瞻:
^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$
请注意,应设置 m
标志。
正则表达式分割:
^
匹配输入字符串的开头(?:
非捕获组的开始{
按字面意思匹配{
(?=
正向前瞻开始[^{}]*[UG]
查找组合中的 [UG]
)
前瞻结束([UGWRB])
匹配并捕获字符类中的字母\/(?!\1)(?1)
匹配/
并查看下一个字符是否与最近捕获的字符不同}
按字面意思匹配}
)+
组结束,至少重复一次$
匹配输入字符串的结尾
关于php - 创建将匹配字符串中的要求的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54095511/