正则表达式匹配引用的字符串但忽略转义的引号

时间:2014-04-01 18:30:26

标签: java regex quotes

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

例如:

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

我想要匹配:

" fsfsdfsd \" "

" fsfsfs "

但不是

" fsfsdfsd \" " parameter2 = " fsfsfs "

等...

4 个答案:

答案 0 :(得分:7)

试试这个:

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

它匹配"test \"(你可以避免使用lookbehind)。如果您需要使用\

,请转义该字符

Online Demo

答案 1 :(得分:3)

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

  1. 任何不是\";
  2. 的字符
  3. 两个字符的序列\";
  4. \后面没有"
  5. 如果需要,您可以通过允许\\代表\或允许其他转义来扩展它;修改上面的列表应该很简单。

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

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

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

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

    (注意:未经测试。)

答案 2 :(得分:0)

你的正则表达式需要负面的背后隐藏:

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

答案 3 :(得分:0)

正确的regexp匹配引号之间的字符串将是:


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

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


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

此表达式与斜杠转义字符匹配并斜线自由,例如:


    ... "123 \\\" 456 \\" ...
              ^       ^ slash literal
              ^
              ^ slash literal + escaped quote

上面评论中写的

regexp将在此示例中失败