正则expression式用于引用带有转义引号的string
如何使用正则expression式获取子string" It's big \"problem " ?
s = ' function(){ return " It\'s big \"problem "; }';
/"(?:[^"\\]|\\.)*"/
在正则expression式教练和PCRE工作台中工作。
JavaScripttesting示例:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }'; var m = s.match(/"(?:[^"\\]|\\.)*"/); if (m != null) alert(m);
这个来自许多linux发行版中的nanorc.sample。 它用于C风格string的语法高亮显示
\"(\\.|[^\"])*\"
正如ePharaoh所提供的,答案是
/"([^"\\]*(\\.[^"\\]*)*)"/
要使上述内容适用于单引号或双引号string,请使用
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
"(?:\\"|.)*?"
交替使用\"和.通过转义引号,而惰性量词*?确保您不会超过引用string的末尾。
这里提供的大多数解决scheme使用替代的重复path,即(A | B)*。
由于某些模式编译器使用recursion来实现这一点,所以在大型input中可能会遇到堆栈溢出。
例如Java: http : //bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
就像这样: "(?:[^"\\]*(?:\\.)?)*" ,否则Guy Bedford提供的将减lessparsing步骤的数量,避免大多数堆栈溢出。
/"(?:[^"\\]++|\\.)*+"/
在安装了Perl 5.22.0的Linux系统上直接从man perlre取出。 作为一个优化,这个正则expression式使用+和*的“posessive”forms来防止回溯,因为事先知道一个没有结束引号的string在任何情况下都不会匹配。
/(["\']).*?(?<!\\)(\\\\)*\1/is
应该使用任何引用的string
这个在PCRE上完美工作,不会因为StackOverflow而下降。
"(.*?[^\\])??((\\\\)+)?+"
说明:
- 每个带引号的string都以Char开头:
"; - 它可能包含任何数量的任何字符:
.*?{懒惰匹配}; 以非转义字符结尾[^\\]; - 语句(2)是懒(!)可选,因为string可以是空的(“”)。 所以:
(.*?[^\\])?? - 最后,每个带引号的string都以Char(
")结尾,但可以在偶数个(\\\\)+码符(\\\\)+;而Greedy(!)可选:((\\\\)+)?+{贪心匹配},bacausestring可以是空的或无结尾对!
我们必须记住,正则expression式不是所有string-y的银子弹。 有些东西用光标和线性,手动,寻找更简单。 CFL可以很简单地实现这个技巧,但是没有太多的CFL实现(afaik)。
https://stackoverflow.com/a/10786066/1794894更广泛的版本;
/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/
这个版本也包含
- 最小报价长度为50
- 额外types的报价(打开
“closures”)
在regexpal四处乱撞 ,结果与这个正则expression式:(不要问我是如何工作的,我甚至不明白,即使我写了哈哈)
"(([^"\\]?(\\\\)?)|(\\")+)+"
如果从一开始search,也许这可以工作?
\"((\\\")|[^\\])*\"
这里是一个与“和”一起工作,你很容易添加其他人在开始。
(“|”)(?:\\\ 1 | [^ \ 1])?* \ 1
它使用反向引用(\ 1)匹配exactley中的第一个组(“或”)。