【问题标题】:Regex matching quoted string but ignoring escaped quotation mark正则表达式匹配带引号的字符串但忽略转义的引号
【发布时间】:2014-05-12 16:55:52
【问题描述】:

我想知道的是如何修改以下正则表达式:\".*?\",因此它会忽略转义的 " 字符 (\"),因此它不会在 \" 处结束匹配。

例如:

parameter1 =  "      fsfsdfsd \"      "   parameter2 =   "   fsfsfs   "

我要匹配:

" fsfsdfsd \" "

" fsfsfs "

但不是

" fsfsdfsd \" " parameter2 = " fsfsfs "

等等……

【问题讨论】:

标签: java regex quotes


【解决方案1】:

试试这个:

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

它与"test \" 匹配(您可以使用lookbehind 来避免这种情况)。如果需要,请使用 \ 转义字符

Online Demo

【讨论】:

    【解决方案2】:

    我通常通过找出可以出现在引号之间的元素来处理这类任务。在这种情况下,每个元素可以是:

    1. 任何不是\"的字符;
    2. 两字符序列\";
    3. 一个\,后面没有"

    如果需要,您可以扩展它,例如允许\\ 代表\,或允许其他转义;修改上面的列表应该很简单。

    那么正则表达式只是遵循列表中的规则:注意:这是一个正则表达式而不是 Java 字符串文字

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

    这意味着,在引号内,我们匹配以下一项或多项: (1) \" 以外的字符(字符类); (2)序列\"; (3) \ 后面没有"(负前瞻)。当然,Java 字符串字面量看起来很丑:

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

    (注:未测试。)

    【讨论】:

      【解决方案3】:

      您将需要在您的正则表达式中进行负面回顾:

      (?<!\\\\)\".*?(?<!\\\\)\"
      

      【讨论】:

        【解决方案4】:

        在引号之间匹配字符串的正确正则表达式将是:

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

        但是因为在java中斜杠需要被转义,结果表达式将是:

        Pattern.compile("\"(?:[^\\\\\\"]+|\\\\.|\\\\\\\\)*\"");

        此表达式匹配斜线转义的字符并自己使用斜线,例如:

        ... "123 \\" 456 \\" ... ^ ^ 斜线字面量 ^ ^ 斜线文字 + 转义引号

        上面用 cmets 编写的正则表达式在这个例子中会失败

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 2011-09-25
          • 2011-08-07
          • 1970-01-01
          相关资源
          最近更新 更多