【问题标题】:RegEx: Match LaTeX-like function with optional parameters正则表达式:将类似 LaTeX 的函数与可选参数匹配
【发布时间】:2016-11-04 15:15:01
【问题描述】:

我想用 PHP 中的可选参数匹配 LaTeX 函数之类的东西。

以下示例应与模式匹配:

example{arg0}
example{arg0}{opt1}
example{arg0}{opt1}{opt2}
example{arg0}{opt1}{opt2}{opt3}

如您所见,第一个参数是必需的,但后面的参数 (opt1-3) 是可选的。

我得到了这个:

/example\{(.*)\}(\{(.*)\})?(\{(.*)\})?(\{(.*)\})?/U

但它只匹配第一个参数(请参阅regex101)。

什么 RegEx 会将每一行识别为匹配项并将参数 opt1-3 识别为组?

【问题讨论】:

  • 当你使用 U-flag 时,你所有的可选组都是惰性的,因此如果不需要就不要匹配。您可以使用 (..)?? 或不使用 U 让它们再次变得懒惰。您还可以考虑使用否定字符类而不是懒惰的 .*,例如 [^}\n\r]*
  • 不使用修饰符U 不起作用(之前尝试过)。但是将所有问号加倍就可以了!非常感谢:)如果你把它作为答案,我会选择并投票。
  • 我高兴得太早了。看起来它在 PCRE 中工作,但不是在 PHP 中工作:/
  • 看起来它在 PCRE 中有效,但在 PHP 中无效 - 你肯定没有正确使用正则表达式。请分享您正在使用的代码。
  • @WiktorStribiżew 你说得对,我在同时更改两行代码时犯了一些错误-.-

标签: php regex


【解决方案1】:

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

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

regex demo

详情

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

PHP demo:

$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);

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多