我需要用结构{A / B}编写一个符合以下要求的正则表达式。
要求/条件:
有效匹配项:
无效的匹配项:
到目前为止,这是我得到的,但是在所有UGWRB组合中,我只获得了14场比赛中的8场。
{([UG])(?(1)|\w)\/(?(1)\w|[UG])}
答案 0 :(得分:1)
您必须使用正面和负面的前瞻才能完成任务:
^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$
请注意,应设置m
标志。
正则表达式细目:
^
匹配输入字符串的开头(?:
非捕获组的开始
{
从字面上匹配{
(?=
开始积极向前
[^{}]*[UG]
组合查找[UG] )
前瞻结束([UGWRB])
匹配并捕获字符类中的字母\/(?!\1)(?1)
匹配/
,看下一个字符是否与最近捕获的字符不同}
从字面上匹配}
)+
组结束,至少重复一次$
匹配输入字符串的结尾答案 1 :(得分:1)
尝试此正则表达式:
^(?!.*{([UGWRB])\/\1})(?:{(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])})+$
说明:
^
-匹配字符串的开头(?!.*{([UGWRB])\/\1})
-前瞻性否定,以确保类似{G/G}
或{U/U}
或{R/R}
的结构在字符串的任何位置都不存在{
-匹配{
(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])
-Regex Conditional。如果当前位置后跟U
或G
,则匹配该字符,后跟/
和字符类[UGWRB]
。否则,匹配字符类[WRB]
,后跟/
,后跟U
或G
}
-匹配}
+
-匹配1次以上的上述子序列(?:{(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])})
$
-匹配字符串的结尾