Javascript 如何匹配!x,但不是!!JS正则表达式中的x?

Javascript 如何匹配!x,但不是!!JS正则表达式中的x?,javascript,regex,Javascript,Regex,鉴于以下案文: 这是!!xa简单字符串!X模式 我想得到一个匹配的regexp!在字符串和模式之间,但不是!!介于is和a之间的xa 此regexp将在字符串拆分中使用 我尝试了几种组合,但无法获得满足我需要的regexp。也许我的表情毕竟不是那么有规律= 提前谢谢 编辑: 解决方案 只需明确说明解决方案是: s、 替换/[^!]|^!x/g,$1一些魔法字符串。拆分/一些魔法字符串/ 感谢jvenema和Amarghosh提出的解决方案。也向所有提供反馈的人 这个表达式应该起作用。它使用一个否

鉴于以下案文:

这是!!xa简单字符串!X模式

我想得到一个匹配的regexp!在字符串和模式之间,但不是!!介于is和a之间的xa

此regexp将在字符串拆分中使用

我尝试了几种组合,但无法获得满足我需要的regexp。也许我的表情毕竟不是那么有规律=

提前谢谢

编辑:

解决方案


只需明确说明解决方案是:

s、 替换/[^!]|^!x/g,$1一些魔法字符串。拆分/一些魔法字符串/


感谢jvenema和Amarghosh提出的解决方案。也向所有提供反馈的人

这个表达式应该起作用。它使用一个否定的look-behind断言来断言只有一个感叹号

(?<!!)!x

这个表达式应该起作用。它使用一个否定的look-behind断言来断言只有一个感叹号

(?<!!)!x
输出:

"This is!!xa simple strin-pattern"
"-This is!!xa simple string-pattern"
编辑:我错过了g,我的错。这一个有效:

var s = "!xThis is!!xa simple string!xpattern";
s.replace(/(([^!])|^)!x/g,'$1-');
输出:

"This is!!xa simple strin-pattern"
"-This is!!xa simple string-pattern"
我们所做的只是匹配前面的字符,然后将其包含回替换中

输出:

"This is!!xa simple strin-pattern"
"-This is!!xa simple string-pattern"
编辑:我错过了g,我的错。这一个有效:

var s = "!xThis is!!xa simple string!xpattern";
s.replace(/(([^!])|^)!x/g,'$1-');
输出:

"This is!!xa simple strin-pattern"
"-This is!!xa simple string-pattern"

我们所做的只是匹配前面的字符,然后将其包含回替换中。

太糟糕了,JS没有lookback:假设没有!x!x、 可以使用RegExp.exec而不是String.split,如中所示

这里,,:[^!]|![^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

可惜JS没有lookback:假设没有!x!x、 可以使用RegExp.exec而不是String.split,如中所示

这里,,:[^!]|![^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


这不会取代g!x和-?非常确定他不想匹配g。与BalusC的解决方案有相同的问题。是的,这适用于替换,因为我可以使用反向引用,但不能用于拆分。说我可以按照Amarghosh的建议做,用一个神奇的字符串替换它,然后将其拆分。只需明确说明解决方案是:s.replace/[^!]|^!x/g,$1SOME\u MAGICAL\u STRING.拆分/SOME\u MAGICAL\u STRING/感谢您为jvenema和Amarghosh提供的解决方案,这不会取代g!x和-?非常确定他不想匹配g。与BalusC的解决方案有相同的问题。是的,这适用于替换,因为我可以使用反向引用,但不能用于拆分。说我可以按照Amarghosh的建议做,用一个神奇的字符串替换它,然后将其拆分。只需明确说明解决方案是:s.replace/[^!]|^!x/g,$1SOME_MAGICAL_STRING'。split/SOME_MAGICAL_STRING/感谢jvenema和AmarghoshSolutions在字符串之前匹配[^!]的解决方案并不理想,因为它们确实必须是^ |[^!]。。。然后你应该让它们不捕获。。。如果它是一个排除了多个字符的前缀,它将不起作用。。。你明白了。丹尼尔·布鲁克纳(Daniel Brückner)的回答中的消极环视要漂亮得多。你真的是指介于is和a之间吗?或者你的意思是介于两者之间!还有一个?@Peter Bailey我说的是我不想让它和!!在is和a之间的x@Jefromi是的,Daniel Brückner的答案确实是最好的,但是JS不支持。也许你可以全部替换!!用当前字符串中的一些字符串\u NOT \u替换x,稍后再将其替换回来。@mpeterson所以可以在上拆分!在中找到x!!x什么时候!!在字符串之前匹配[^!]的is和a?解决方案并不理想,因为它们必须是^ |[^!]。。。然后你应该让它们不捕获。。。如果它是一个排除了多个字符的前缀,它将不起作用。。。你明白了。丹尼尔·布鲁克纳(Daniel Brückner)的回答中的消极环视要漂亮得多。你真的是指介于is和a之间吗?或者你的意思是介于两者之间!还有一个?@Peter Bailey我说的是我不想让它和!!在is和a之间的x@Jefromi是的,Daniel Brückner的答案确实是最好的,但是JS不支持。也许你可以全部替换!!用当前字符串中的一些字符串\u NOT \u替换x,稍后再将其替换回来。@mpeterson所以可以在上拆分!在中找到x!!x什么时候!!x没有被is和a包围?我以前从来没有见过这个表达式,什么是呢?Javascript不支持负面的look behinds或look behinds,这是一个lookbehind表达式,比如?!这是向前看。然而,JavaScript的RegExp中没有lookback,甚至lookahead在IE中也有严重问题。@mpeterson它是什么?遗憾的是,javascript不支持反向查找的语法
请看,我明白了,谢谢你。可惜javascript不支持它。我以前从未见过这个表达式,它支持什么?javascript不支持负面的look behinds或look behinds,这是一个lookbehind表达式,比如?!这是向前看。然而,JavaScript的RegExp中没有lookback,甚至lookahead在IE中也有严重问题。@mpeterson它是什么?遗憾的是,javascript不支持lookbehindoh,我明白了,谢谢。可惜javascript不支持它。我可以连续两次使用它!在我的模式中是x。发现的解决方案被证明是非常简单的,但这是个好主意。我可以有两个连续的!在我的模式中是x。发现的解决方案被证明更简单,但这是个好主意。