我希望在PHP中将LaTeX函数与可选参数匹配。
以下示例应与模式匹配:
example{arg0}
example{arg0}{opt1}
example{arg0}{opt1}{opt2}
example{arg0}{opt1}{opt2}{opt3}
如您所见,第一个参数是必需的,但以下参数(opt1-3)是可选的。
我得到了这个:
/example\{(.*)\}(\{(.*)\})?(\{(.*)\})?(\{(.*)\})?/U
但它只匹配第一个参数(参见regex101)。
什么RegEx会将每一行识别为匹配并将参数opt1-3识别为组?
答案 0 :(得分:1)
您可以删除/U
贪婪转换修饰符,并将所有.*
替换为[^{}]*
:
'~example(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?~'
请参阅regex demo
<强>详情:
example
- 字符串example
(?:\{([^{}]*)\})?
- 与{
匹配的可选组,然后捕获除{
和}
以外的零个或多个字符,然后匹配}
(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?(?:\{([^{}]*)\})?
- 同上。 (上面的子模式重复3次)$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);