Regex不允许“;并且允许“;

Regex that disallows " and allows "

本文关键字:Regex 不允许      更新时间:2024-06-18

我写这篇文章是为了提取被引号(")包围的字符串。我在jquery中使用下面的语句来获取它。

var item = objstr.match(/'"(([^'"])*)'"/g);

但我想破例允许''"。

此正则表达式也可以工作,而无需使用look-aheads或look-behinds:(删除空格!)

/" ('''' | ''" | [^"])* "/

阅读:从双引号到双引号匹配字符串。中间可能没有转义反斜杠''、转义双引号'"或任何非引号字符,也可能有任何组合。这允许像这样的输入

"abc''abc'abc'"abc'''"abc"

有效,但不是

"abc''"abc"
//    ^ String terminates here

如果您的字符串可能具有未标注的含义'",您可能会希望这样做。

@nickb的答案没有这个特性/bug,不管你怎么称呼它。这两个字符串在他的正则表达式中都是有效的。

如果您的正则表达式引擎能够关闭回溯,现在就是使用它的时候了。在Perl中,我必须向量词添加+(或者转向深奥的分支重置)。我不知道你需要什么。

/" ('''' | ''" | [^"])*+ "/

我们还想要贪婪行为,因此没有*?构造。

我测试了http://writecodeonline.com/javascript/:

var s = "wwww'"ooxx'''"xyz'"";
var foo = s.match(/"(?:[^''"]|''.)*"/);
document.write(foo[0]);     

这个问题被问了很多次,总是得到同样明显但不正确的答案。)

负查找方法(?<!'')"不起作用,因为它无法解释转义的反斜杠。我知道问题中没有提到这一点,但如果源文本使用反斜杠来转义引号,除非另有说明,否则你应该假设它也使用反斜杠转义其他反斜杠。

交替方法"(?:[^''"]|''.)*"处理转义的反斜杠,但不正确。添加另一个替代方案"(''''|''"|[^"])*"并不能解决这个问题。它可以匹配有效的输入,但给定了一个格式错误的字符串:

"escaped '"quotes'" but no ending quote

它没有像应该的那样报告失败的匹配,而是错误地匹配了这个:

"escaped '"quotes'"

以下是RegexBuddy图书馆中的最佳方法,并在《》一书中进行了讨论

/"[^"'']*(?:''.[^"'']*)*"/g

如果匹配的字符串不应该包括行分隔符(如Java字符串文字),请使用以下内容:

/"[^"'''r'n]*(?:''.[^"'''r'n]*)*"/g

其他方法也是可能的,但这一方法有三个主要优点:它已经被多次证明;它非常高效;而且它不依赖于高级功能——换句话说,它甚至可以在JavaScript中工作,JavaScript是Perl派生的regex风格的红头继子。:D