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

时间:2016-04-24 02:10:48

标签: c++ regex boost match boost-regex

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

^((([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应匹配。

function fearNotLetter(str) { var newstr; for(var j = 0; j < str.length; j++){ var previous = str.charCodeAt(j); var next = str.charCodeAt(j) + 1; if(next === false){ newstr = String.fromCharCode(next); } else { return undefined; } } return newstr; } 不匹配。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,你可以做到。使用递归正则表达式

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

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

说明

  1. (?1)是一个递归正则表达式,用于重复组1的正则表达式模式。如果要对整个字符串执行递归正则表达式,请使用(?R),但是您将无法使用开头锚^
  2. (;|$)匹配的正则表达式应以;或字符串$的结尾结束。
  3. 使用\s代替空白而不是[ ]
  4. ;*[;]*相同。
  5. 您可以在此处了解有关递归正则表达式的更多信息:http://www.rexegg.com/regex-recursion.html

答案 1 :(得分:0)

一般情况下,复制很难看,但在这种情况下,最有效的方法是重复这种模式:

FOO(;FOO)+

(如果需要,将FOO替换为(([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b)) +一些空格