Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式:以任意顺序匹配可选的替换项,不允许重复_Php_Regex_Alternating - Fatal编程技术网

Php 正则表达式:以任意顺序匹配可选的替换项,不允许重复

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

我的问题与第一个问题非常相似,只是我想让每个选项都是可选的,并且不重复

示例:正则表达式需要匹配以下字符串(这过于简单,A和B可能很复杂):

它不能匹配XAA、XBB、XABA、XABB、XBAA

以下是我到目前为止的情况:

/(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;