如果发现其他组不止一次,如何强制执行组

Rog*_*ger 5 c++ regex boost match boost-regex

到目前为止,这是我的正则表达式:

^((([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))[ ]*[;]*[ ]*)+$
Run Code Online (Sandbox Code Playgroud)

;如果我(([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))在第一个之后找到另一个,我想至少制作一个强制性的.

/tests/phone PHONE_NUMBER ; /tests/IP IP_ADDRESS 应该匹配.

/tests/phone PHONE_NUMBER /tests/IP IP_ADDRESS 不应该匹配.

我怎样才能做到这一点?

Ami*_*ini 1

是的,你可以这样做。为此使用递归正则表达式。

^(((\s*(([\w_\/-]+)\s)((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))\s*))(;|$)(?1)*)
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/dE2nK2/3

解释

  1. (?1)是一个递归正则表达式,用于重复组 1 的正则表达式模式。如果您想对整个字符串执行递归正则表达式,请使用(?R),但您将无法使用起始锚点^
  2. (;|$)匹配的正则表达式应以;字符串的任一或结尾结尾$
  3. 用于\s空格而不是[ ].
  4. ;*并且[;]*是相同的。

您可以在此处了解有关递归正则表达式的更多信息:http://www.rexegg.com/regex-recursion.html