正则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而下降。

 "(.*?[^\\])??((\\\\)+)?+" 

说明:

  1. 每个带引号的string都以Char开头: " ;
  2. 它可能包含任何数量的任何字符: .*? {懒惰匹配}; 以非转义字符结尾[^\\] ;
  3. 语句(2)是懒(!)可选,因为string可以是空的(“”)。 所以: (.*?[^\\])??
  4. 最后,每个带引号的string都以Char( " )结尾,但可以在偶数个(\\\\)+码符(\\\\)+ ;而Greedy(!)可选: ((\\\\)+)?+ {贪心匹配},bacausestring可以是空的或无结尾对!

我们必须记住,正则expression式不是所有string-y的银子弹。 有些东西用光标和线性,手动,寻找更简单。 CFL可以很简单地实现这个技巧,但是没有太多的CFL实现(afaik)。

https://stackoverflow.com/a/10786066/1794894更广泛的版本;

 /"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/ 

这个版本也包含

  1. 最小报价长度为50
  2. 额外types的报价(打开closures

在regexpal四处乱撞 ,结果与这个正则expression式:(不要问我是如何工作的,我甚至不明白,即使我写了哈哈)

 "(([^"\\]?(\\\\)?)|(\\")+)+" 

如果从一开始search,也许这可以工作?

 \"((\\\")|[^\\])*\" 

这里是一个与“和”一起工作,你很容易添加其他人在开始。

  (“|”)(?:\\\ 1 | [^ \ 1])?* \ 1 

它使用反向引用(\ 1)匹配exactley中的第一个组(“或”)。

http://www.regular-expressions.info/backref.html