繁体   English   中英

如何在JS正则表达式中匹配!x但不匹配!! x?

[英]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/)

感谢您为jvenemaAmarghosh提出的解决方案。 也向所有提供反馈的人。

这个表达式应该可以完成任务。 它使用断言背后的否定性断言来断言只有一个感叹号。

(?<!!)!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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM