Php 正则表达式:将类LaTeX函数与可选参数匹配

Php 正则表达式:将类LaTeX函数与可选参数匹配,php,regex,Php,Regex,我想在PHP中将LaTeX函数之类的函数与可选参数相匹配 以下示例应与模式匹配: example{arg0} example{arg0}{opt1} example{arg0}{opt1}{opt2} example{arg0}{opt1}{opt2}{opt3} 如您所见,第一个参数是必需的,但以下参数(opt1-3)是可选的 我得到了这个: /example\{(.*)\}(\{(.*)\})?(\{(.*)\})?(\{(.*)\})?/U 但它只匹配第一个参数(请参阅) 什么正则表达

我想在PHP中将LaTeX函数之类的函数与可选参数相匹配

以下示例应与模式匹配:

example{arg0}
example{arg0}{opt1}
example{arg0}{opt1}{opt2}
example{arg0}{opt1}{opt2}{opt3}
如您所见,第一个参数是必需的,但以下参数(opt1-3)是可选的

我得到了这个:

/example\{(.*)\}(\{(.*)\})?(\{(.*)\})?(\{(.*)\})?/U
但它只匹配第一个参数(请参阅)


什么正则表达式会将每一行识别为匹配,将参数opt1-3识别为组?

您可以删除
/U
贪婪切换修饰符,并将所有
*
替换为
[^{}]*

'~example(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?~'

详细信息

  • 示例
    -字符串
    示例
  • (?:\{([^{}]*)\})
    -与
    {
    匹配的可选组,然后捕获除
    {
    }
    之外的零个或多个字符,然后匹配
    }
  • (?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?
    -同上。(以上子模式重复3次)
:


当您使用U型标志时,您的所有可选组都是惰性的,因此如果它们不需要匹配,则不匹配。你可以通过使用<代码>(..).<代码>或不使用u来再次使它们懒惰,也可以考虑使用否定的字符类,而不是懒惰<代码> *>代码>,比如<代码> [^ }\n\r] *<代码>不使用修饰符<代码> u>代码> IST不工作(尝试之前)。但是把所有的问号都加倍就成功了!非常感谢:)如果你把它作为答案,我会选择并投票。我太高兴了,太快了。看起来它在PCRE中工作,但不使用PHP:/看起来它在PCRE中工作,但不使用PHP-您肯定没有正确使用正则表达式。请分享您正在使用的代码。@WiktorStribiżew您是对的,我在同时更改两行代码时犯了一些错误--
$re = '~example(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?~';
$str = 'example{arg0}
example{arg0}{opt1}
example{arg0}{opt1}{opt2}
example{arg0}{opt1}{opt2}{opt3}';
preg_match_all($re, $str, $matches);
print_r($matches);