[英]How to match !x but not !!x in JS regex?
给出以下文本:
This is!!xa simple string!xpattern
我想获得一个正则表达式,它与“ string”和“ pattern”之间的!x
匹配,但不与“ is”和“ a”之间的!!xa
匹配。
此正则表达式将在字符串split()
。
我已经尝试了几种组合,但是无法获得满足我需求的正则表达式。 也许我的表情毕竟不是那么规则=)
提前致谢!
编辑:
解
只是说清楚解决方案将是:
s.replace(/(([^!])|^)!x/g,'$1SOME_MAGICAL_STRING').split(/SOME_MAGICAL_STRING/)
感谢您为jvenema和Amarghosh提出的解决方案。 也向所有提供反馈的人。
这个表达式应该可以完成任务。 它使用断言背后的否定性断言来断言只有一个感叹号。
(?<!!)!x
var s = "This is!!xa simple string!xpattern";
s.replace(/[^!]!x/,'-');
输出:
"This is!!xa simple strin-pattern"
编辑:我错过了g,我不好。 这个作品:
var s = "!xThis is!!xa simple string!xpattern";
s.replace(/(([^!])|^)!x/g,'$1-');
输出:
"-This is!!xa simple string-pattern"
我们要做的就是匹配前面的字符,然后将其包含在替换字符中。
太糟糕的JS没有落后:)假设没有!x!x
,您可以使用RegExp.exec
而不是String.split
,如
rx = /((?:[^!]|![^x])+)(?:!x|$)/g
res = []
while ((m = rx.exec("This is!!xa simple string!xpattern")))
res.push(m[1]);
在这里, (?:[^!]|![^x])+
匹配一个或多个非感叹号或一个!
不跟x
。 后一种情况摆脱了!!
。 (?:!x|$)
使用!x
终止符。
编辑:因为!x!x
可能发生,所以必须对循环进行一些修改以避免无限循环。
rx = /((?:[^!]|![^x])*)(?:!x|$)/g
res = []
str = "This is!!xa simpl!!xe!x!x string!xpattern"
while (true) {
var m = rx.exec(str);
if (m.index >= str.length)
break;
res.push(m[1]);
}
res
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.