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

时间:2008-10-30 10:53:03

标签: regex escaping quotes

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

s = ' function(){  return " It\'s big \"problem  ";  }';     

16 个答案:

答案 0 :(得分:129)

/"(?:[^"\\]|\\.)*"/

适用于Regex Coach和PCRE Workbench。

JavaScript中的测试示例:

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

答案 1 :(得分:27)

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

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

答案 2 :(得分:14)

由ePharaoh提供,答案是

/"([^"\\]*(\\.[^"\\]*)*)"/

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

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

答案 3 :(得分:8)

"(?:\\"|.)*?"

在延迟量词\"确保您不会超过引用字符串的末尾时,将.*?传递给转义的转义引号。适用于.NET Framework RE类

答案 4 :(得分:8)

此处提供的大多数解决方案都使用替代重复路径,即(A | B)*。

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

例如,

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

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

答案 5 :(得分:6)

/"(?:[^"\\]++|\\.)*+"/

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

答案 6 :(得分:4)

这个适用于PCRE,并且不适用于StackOverflow。

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

说明:

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

答案 7 :(得分:3)

/(["\']).*?(?<!\\)(\\\\)*\1/is

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

答案 8 :(得分:1)

这是一个同时使用“和”的工具,您可以在开始时轻松添加其他工具。

("|')(?:\\\1|[^\1])*?\1

它使用反向引用(\ 1)匹配firstley在第一组中的内容(“或”)。

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

答案 9 :(得分:0)

必须记住,正则表达式不是所有字符串的银弹。有些东西更容易用光标和线性,手动,寻找。一个CFL可以很轻松地完成这个技巧,但是没有很多CFL实现(afaik)。

答案 10 :(得分:0)

如果从头开始搜索,也许这可行吗?

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

答案 11 :(得分:0)

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

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

此版本还包含

  1. 最低报价长度为50
  2. 额外类型的引号(打开并关闭

答案 12 :(得分:0)

regexpal处徘徊并最终得到了这个正则表达式:(不要问我它是如何工作的,即使我写它也几乎不懂lol)

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

答案 13 :(得分:0)

以前没有涉及的选项是:

  1. 反转字符串。
  2. 在反向字符串上执行匹配。
  3. 重新翻转匹配的字符串。
  4. 这有额外的好处,能够正确匹配转义的开放标签。

    让我们说你有以下字符串; String \"this "should" NOT match\" and "this \"should\" match" 在这里,\"this "should" NOT match\"不应该匹配,"should"应该匹配。 最重要的是this \"should\" match应该匹配,\"should\"不应该匹配。

    首先是一个例子。

    // The input string.
    const myString = 'String \\"this "should" NOT match\\" and "this \\"should\\" match"';
    
    // The RegExp.
    const regExp = new RegExp(
        // Match close
        '([\'"])(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))' +
        '((?:' +
            // Match escaped close quote
            '(?:\\1(?=(?:[\\\\]{2})*[\\\\](?![\\\\])))|' +
            // Match everything thats not the close quote
            '(?:(?!\\1).)' +
        '){0,})' +
        // Match open
        '(\\1)(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))',
        'g'
    );
    
    // Reverse the matched strings.
    matches = myString
        // Reverse the string.
        .split('').reverse().join('')
        // '"hctam "\dluohs"\ siht" dna "\hctam TON "dluohs" siht"\ gnirtS'
    
        // Match the quoted
        .match(regExp)
        // ['"hctam "\dluohs"\ siht"', '"dluohs"']
    
        // Reverse the matches
        .map(x => x.split('').reverse().join(''))
        // ['"this \"should\" match"', '"should"']
    
        // Re order the matches
        .reverse();
        // ['"should"', '"this \"should\" match"']
    

    好的,现在来解释一下RegExp。 这是正则表达式可以很容易地分成三个部分。如下:

    # Part 1
    (['"])         # Match a closing quotation mark " or '
    (?!            # As long as it's not followed by
      (?:[\\]{2})* # A pair of escape characters
      [\\]         # and a single escape
      (?![\\])     # As long as that's not followed by an escape
    )
    # Part 2
    ((?:          # Match inside the quotes
    (?:           # Match option 1:
      \1          # Match the closing quote
      (?=         # As long as it's followed by
        (?:\\\\)* # A pair of escape characters
        \\        # 
        (?![\\])  # As long as that's not followed by an escape
      )           # and a single escape
    )|            # OR
    (?:           # Match option 2:
      (?!\1).     # Any character that isn't the closing quote
    )
    )*)           # Match the group 0 or more times
    # Part 3
    (\1)           # Match an open quotation mark that is the same as the closing one
    (?!            # As long as it's not followed by
      (?:[\\]{2})* # A pair of escape characters
      [\\]         # and a single escape
      (?![\\])     # As long as that's not followed by an escape
    )
    

    图像形式可能更清晰:使用Jex's Regulex

    生成

    Image on github (JavaScript Regular Expression Visualizer.) 抱歉,我没有足够的声誉来包含图片,所以,它现在只是一个链接。

    以下是使用此概念的示例函数的要点,它更高级:https://gist.github.com/scagood/bd99371c072d49a4fee29d193252f5fc#file-matchquotes-js

答案 14 :(得分:0)

我在尝试删除可能会影响解析某些文件的引用字符串时遇到了类似的问题。

我最终得到了一个两步解决方案,可以击败你能想出的任何复杂的正则表达式:

 line = line.replace("\\\"","\'"); // Replace escaped quotes with something easier to handle
 line = line.replaceAll("\"([^\"]*)\"","\"x\""); // Simple is beautiful

易于阅读,效率可能更高。

答案 15 :(得分:0)

如果您的IDE是IntelliJ Idea,您可以忘记所有这些麻烦,并将正则表达式存储在String变量中,然后将其复制粘贴到双引号中,它将自动更改为正则表达式可接受的格式。

Java示例:

String s = "\"en_usa\":[^\\,\\}]+";

现在您可以在正则表达式中或任何地方使用此变量。