【问题标题】:Match two quotes not preceded by opening bracket匹配前面没有左括号的两个引号
【发布时间】:2016-04-25 10:43:47
【问题描述】:

我需要一个匹配所有出现的两个引号 ('') 的正则表达式,而不是前面的左括号 (()。我对括号做了一个否定的前瞻,然后是一个引号。但是为什么这不起作用:

/(?!\()''/g

例如这个字符串

(''test''test

它应该匹配第二个匹配项,但不匹配第一个匹配项,但它匹配两者。


当我使用完全相同的解决方案但检查新行而不是括号时,它可以正常工作:

/(?!^)''/g

用这个字符串:

''test''test

它只匹配第二次出现。

经过测试here

【问题讨论】:

  • 您需要的最终结果是什么?只是匹配?还是替换?
  • \b'' ......
  • @WiktorStribizew 替换
  • "(''test''test".replace(/(^|[^('])''(?!')/g, "$1bar")
  • @AvinashRaj Your regex 不会匹配连续的双撇号。

标签: javascript regex lookahead


【解决方案1】:

即使您需要处理连续的双撇号,以下解决方案也能正常工作:

var output = "''(''test'''''''test".replace(/(\()?''/g, function($0, $1){
	return $1 ? $0 : 'x';
});
document.body.innerHTML = output;

这里,/(\()?''/g 正则表达式搜索所有匹配 ( 和不匹配,但在替换回调方法中,我们检查组 1 匹配。如果 Group 1 匹配,并且不为空,我们使用整个匹配作为替换文本($0 代表整个匹配值),如果不是('' 之前没有()我们只需插入替换。

【讨论】:

    【解决方案2】:

    Javascript 不支持回溯,这很糟​​糕,但有一种解决方法。

    尝试:

    [^\(]('{2,2})
    

    https://regex101.com/r/gT5jR6/1

    【讨论】:

    • 感谢您的回答,但您的正则表达式不仅匹配引号,还匹配前导字符。在您的示例中,它匹配 e''
    • 没有。只需阅读 $1 或第 1 组。不是完整的捕获。在演示链接中查看 MATCH1 的含义。
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多