Php 创建与字符串中的要求匹配的正则表达式 问题
我需要编写一个正则表达式,它将在结构为{a/B}的字符串中匹配以下要求 要求/条件:Php 创建与字符串中的要求匹配的正则表达式 问题,php,regex,expression,Php,Regex,Expression,我需要编写一个正则表达式,它将在结构为{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}{
- 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}
- {B/W}
{([UG])(?(1)|\w)\/(?(1)\w |[UG])}
为了完成任务,您必须同时处理负面和正面的外观:
^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$
看
请注意,应设置m
标志
正则表达式细分:
匹配输入字符串的开头^
非捕获组的开始(?:
按字面意思匹配{
{
正向前瞻的开始(?=
在组合中查找[UG][^{}]*[UG]
前瞻结束)
匹配并捕获字符类中的字母([UGWRB])
匹配\/(?!\1)(?1)
并查看下一个字符是否与最近捕获的字符不同/
按字面意思匹配}
}
结束分组,至少重复一次)+
匹配输入字符串的结尾$
^(?!.*{([UGWRB])\/\1})(?:{(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])})+$
说明:
-匹配字符串的开头^
-负向前看,以确保字符串中的任何位置都不存在类似(?!.{([UGWRB])\/\1}
或{G/G}
或{U/U}
的结构{R/R}
-匹配{
{
-如果当前位置后跟(?(?=[UG])。\/[UGWRB]\/[UG])
或U
,则匹配该字符后跟G
//code>和字符类
。否则,匹配字符类[UGWRB]
后接[WRB]
后接/
或U
G
-匹配}
}
-匹配上述子序列+
(?:{(?=[UG])。\/[UGWRB].[WRB]\/[UG]))的1+个匹配项。
-匹配字符串的结尾$
WRB
。为什么{W/G}{U/B}
是无效的?@abracadver你是什么意思?@revo这是个错误,对不起。为什么要把这么复杂的东西塞进一个正则表达式中呢?如果您拆分字符串并处理其每个子组件,您的代码将更清晰、更简单、更易于维护。标记为解决方案是因为1)工作正常2)比regex101中的其他解决方案稍快,3)比其他解决方案更易读。谢谢,这正按预期工作,然而,另一个答案是更快更干净。很抱歉迟了答复。