正则引用带引号的带引号的字符串

112 regex quotes escaping

如何" It's big \"problem "使用正则表达式获取子字符串?

s = ' function(){  return " It\'s big \"problem  ";  }';     
Run Code Online (Sandbox Code Playgroud)

Phi*_*Lho 144

/"(?:[^"\\]|\\.)*"/
Run Code Online (Sandbox Code Playgroud)

适用于Regex Coach和PCRE Workbench.

JavaScript中的测试示例:

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);
Run Code Online (Sandbox Code Playgroud)

  • 说得通.简体中文:两个引号围绕零或多个"任何不是引号或反斜杠的字符"或"反斜杠后跟任何字符".我不敢相信我没想过那样做...... (19认同)
  • 谢谢你.我想匹配单引号,所以我最终调整它:`/(["'])(?:[^\1 \\] | \\.)*?\ 1 /` (9认同)
  • 我会自己回答.=)`(?:...)`是被动或非捕获组.这意味着它以后不能被反向引用. (6认同)

小智 28

这个来自许多Linux发行版中的nanorc.sample.它用于C样式字符串的语法高亮显示

\"(\\.|[^\"])*\"
Run Code Online (Sandbox Code Playgroud)


小智 17

正如ePharaoh所提供的,答案是

/"([^"\\]*(\\.[^"\\]*)*)"/
Run Code Online (Sandbox Code Playgroud)

要将上述内容应用于单引号或双引号字符串,请使用

/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
Run Code Online (Sandbox Code Playgroud)

  • 请参阅下面的@ MarcAndrePoulin的答案以获得解释. (3认同)
  • 这是唯一对我有用的,包含1.5个大单引号的,包含99个转义符的字符串的设置。此页面上的所有其他表达式在我的文本编辑器中都出现了溢出错误。尽管此处大多数功能都可以在浏览器中运行,但请记住一些注意事项。小提琴:https://jsfiddle.net/aow20y0L/ (2认同)

Mar*_*lin 9

这里提供的大多数解决方案使用替代的重复路径,即(A | B)*.

您可能会遇到大型输入上的堆栈溢出,因为某些模式编译器使用递归实现此操作.

例如Java:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993

像这样的东西: "(?:[^"\\]*(?:\\.)?)*"或者Guy Bedford提供的那个将减少解析步骤的数量,避免大多数堆栈溢出.


小智 8

/(["\']).*?(?<!\\)(\\\\)*\1/is
Run Code Online (Sandbox Code Playgroud)

应该适用于任何带引号的字符串

  • @PhiLho,仅使用单个 (?&lt;!\\\) 会在字符串末尾转义反斜杠时失败。不过,JavaScript 中的后视是正确的。 (2认同)

小智 8

"(?:\\"|.)*?"
Run Code Online (Sandbox Code Playgroud)

交替\".传递转义的转义,而惰性量词*?确保您不会超过引用字符串的末尾.适用于.NET Framework RE类


ack*_*ack 7

/"(?:[^"\\]++|\\.)*+"/
Run Code Online (Sandbox Code Playgroud)

直接从man perlre安装了Perl 5.22.0的Linux系统上获取.作为优化,这个正则表达式使用两者的'posessive'形式+*防止回溯,因为事先已知在没有结束引用的字符串在任何情况下都不匹配.


Vad*_*yfi 5

这个在 PCRE 上工作得很好,并且不属于 StackOverflow。

"(.*?[^\\])??((\\\\)+)?+"
Run Code Online (Sandbox Code Playgroud)

解释:

  1. 每个带引号的字符串都以 Char: 开头"
  2. 它可以包含任意数量的任意字符:.*?{Lazy match}; 以非转义字符结尾[^\\]
  3. 语句 (2) 是 Lazy(!) 可选的,因为字符串可以为空 ("")。所以:(.*?[^\\])??
  4. 最后,每个带引号的字符串都以 Char( ")结尾,但它前面可以有偶数个转义符号对(\\\\)+;它是 Greedy(!) 可选的:((\\\\)+)?+{Greedy matching},因为字符串可以为空或没有结尾对!