到目前为止,这是我的正则表达式:
^((([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;
}
不匹配。
我怎样才能做到这一点?
答案 0 :(得分:1)
^(((\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
答案 1 :(得分:0)
一般情况下,复制很难看,但在这种情况下,最有效的方法是重复这种模式:
FOO(;FOO)+
(如果需要,将FOO
替换为(([a-zA-Z0-9_\/-]+)[ ])+((\bPHONE_NUMBER\b)|(\b(IP|EMAIL)_ADDRESS\b))
+一些空格