RegEx:将类似LaTeX的函数与可选参数匹配

时间:2016-11-04 15:15:01

标签: php regex

我希望在PHP中将LaTeX函数与可选参数匹配。

以下示例应与模式匹配:

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

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

我得到了这个:

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

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

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

1 个答案:

答案 0 :(得分: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);