Php 正则表达式:以任意顺序匹配可选的替换项,不允许重复
我的问题与第一个问题非常相似,只是我想让每个选项都是可选的,并且不重复 示例:正则表达式需要匹配以下字符串(这过于简单,A和B可能很复杂): 它不能匹配XAA、XBB、XABA、XABB、XBAA 以下是我到目前为止的情况:Php 正则表达式:以任意顺序匹配可选的替换项,不允许重复,php,regex,alternating,Php,Regex,Alternating,我的问题与第一个问题非常相似,只是我想让每个选项都是可选的,并且不重复 示例:正则表达式需要匹配以下字符串(这过于简单,A和B可能很复杂): 它不能匹配XAA、XBB、XABA、XABB、XBAA 以下是我到目前为止的情况: /(X)(?:(A)|(B)){0,2}$/ 这允许重复(例如XAA),并且似乎会导致PHP中带有空数组元素的XB出现问题 编辑:忘记提到我需要获得X、A和B的实际值(如果可用)。它不仅仅是完整字符串的匹配。最干净的方法是定义每个组,然后按特定顺序使用这些定义: # Sta
/(X)(?:(A)|(B)){0,2}$/
这允许重复(例如XAA),并且似乎会导致PHP中带有空数组元素的XB出现问题
编辑:忘记提到我需要获得X、A和B的实际值(如果可用)。它不仅仅是完整字符串的匹配。最干净的方法是定义每个组,然后按特定顺序使用这些定义:
# Start defining
(?(DEFINE)
(?<X>xrules)
(?<A>arules)
(?<B>brules)
)
# End defining
^ # begin of string
(?&X) # Use rule X
(?: # non-capturing group
(?&A)(?&B)? # Use rule A and make rule B optional
| # or
(?&B)(?&A)? # Use rule B and make rule A optional
)? # make it optional
$ # end of string
#开始定义
(?(定义)
(?xrules)
(?使用:
说明:
您的问题可以有这样的标题:“如何不重复可选组?”
$pattern=您基本上是说它不能多次匹配A
或B
,那么您为什么不检查一下,然后去掉regex?if(substr\u count($string,'A')>=2)echo'error!;
如果你想继续使用它,这里有一个正则表达式演示…为什么这个解决方案不像Tim的那样分别匹配X、a或B?@user371699,因为它不应该匹配。你可以总是包装一些捕获组,但它会变得丑陋。你也许可以合并这两个答案。我认为括号中的任何东西都会被捕获NL除非它有?:
。为什么这似乎是一个例外?@user371699,因为(?&A)
是对命名组A
定义的反向引用。
# Start defining
(?(DEFINE)
(?<X>xrules)
(?<A>arules)
(?<B>brules)
)
# End defining
^ # begin of string
(?&X) # Use rule X
(?: # non-capturing group
(?&A)(?&B)? # Use rule A and make rule B optional
| # or
(?&B)(?&A)? # Use rule B and make rule A optional
)? # make it optional
$ # end of string
/(X)(?!A{2})(?!B{2})(?:(A)|(B)){0,2}$/
(X) # Match and capture X
(?!A{2}) # Assert that it's impossible to match AA
(?!B{2}) # Same for BB
(?: # Non-capturing group:
(A) # Match and capture A
| # or
(B) # Match and capture B
){0,2} # Do this 0-2 times
$ # Then match the end of the string
$pattern = <<<'LOD'
~
(?(DEFINE)
(?<X> FOO )
(?<A> BAR )
(?<B> BAZ )
)
^ \g<X> (?: \g<A> (?! .* \g<A> ) | \g<B> (?! .* \g<B> ) ){0,2} $
~xs
LOD;