正则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中的第一个组(“或”)。