如果多次找到其他组,如何使组成为强制性组
How to make group mandatory if other group is found more than once
到目前为止,这是我的正则表达式:
^((([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))[ ]*[;]*[ ]*)+$
如果我在第一个 (([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))
之后发现另一个 (([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
不应该匹配。
我怎样才能做到这一点?
是的,你可以做到。为此使用递归正则表达式。
^(((\s*(([\w_\/-]+)\s)((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))\s*))(;|$)(?1)*)
https://regex101.com/r/dE2nK2/3
说明
(?1)
是一个递归正则表达式,用于重复第 1 组的正则表达式模式。如果你想对整个字符串执行递归正则表达式,请使用 (?R)
,但你将无法使用起始锚 ^
.
(;|$)
匹配的正则表达式应以 ;
或字符串结尾 $
. 结束
- 使用
\s
作为空格而不是 [ ]
。
;*
和[;]*
是一样的。
您可以在此处了解有关递归正则表达式的更多信息:http://www.rexegg.com/regex-recursion.html
复制通常很难看,但在这种情况下,最有效的方法是重复模式:
FOO(;FOO)+
(将 FOO
替换为您的 (([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))
+ 一些空格(如果需要)
到目前为止,这是我的正则表达式:
^((([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))[ ]*[;]*[ ]*)+$
如果我在第一个 (([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))
之后发现另一个 (([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
不应该匹配。
我怎样才能做到这一点?
是的,你可以做到。为此使用递归正则表达式。
^(((\s*(([\w_\/-]+)\s)((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))\s*))(;|$)(?1)*)
https://regex101.com/r/dE2nK2/3
说明
(?1)
是一个递归正则表达式,用于重复第 1 组的正则表达式模式。如果你想对整个字符串执行递归正则表达式,请使用(?R)
,但你将无法使用起始锚^
.(;|$)
匹配的正则表达式应以;
或字符串结尾$
. 结束
- 使用
\s
作为空格而不是[ ]
。 ;*
和[;]*
是一样的。
您可以在此处了解有关递归正则表达式的更多信息:http://www.rexegg.com/regex-recursion.html
复制通常很难看,但在这种情况下,最有效的方法是重复模式:
FOO(;FOO)+
(将 FOO
替换为您的 (([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))
+ 一些空格(如果需要)