如果转义字符位于参数值的末尾,则正则表达式创建会出现问题

Problem with regex creation if excape character is at the end of the parameter value

我在一个字符串中得到了三个参数。每个参数都以以下形式编写:引号、名称、引号、等号、引号、文本、引号。参数分隔符是 space。 示例 1:

"param1"="Peter" "param2"="Harald" "param3"="Marie"

使用 java.util.regex.Matcher 我可以通过以下正则表达式找到任何名称和文本:

"([^"]*)"\s*=\s*"([^"]*)"

但是,现在文本中可能有引号。这被反斜杠掩盖了。 示例 2:

"param1"="Peter" "param2"="Har\"ald" "param3"="Marie" 

我构建了以下正则表达式:

"([^"]*)"\s*=\s*("([^"]*(\")*[^"]*)*[^\]")

这适用于示例 2,但不是通用解决方案。

如果反斜杠位于参数值的末尾,则该解决方案不再有效。 示例 3:

"param1"="Peter" "param2"="Harald\" "param3"="Marie"

如果反斜杠位于值的末尾,则匹配器会将“Harald\” 解释为参数 2 的值,而不是“Harald\”。

你有这个问题的通用解决方案吗?预先感谢您的意见。

亲切的问候 多米尼克

您可以在 Java:

中使用此正则表达式
\"([^\"]*)\"\h*=\h*(\"[^\\"]*(?:\(?=\"(?:\h|$))|(?:\.[^\\"]*))*\")

RegEx Demo

正则表达式演示:

  • \"([^\"]*)\":匹配带引号的字符串参数名
  • \h*=\h*:匹配 = 周围有可选空格
  • (: 开始捕获组#1
  • \": 比赛开始"
  • [^\\"]*:匹配0个或多个non-quote、non-backslash个字符
  • (?::
    • \:匹配一个\
    • (?=\"(?:\h|$)):必须后跟一个 ",后面有空格或行
    • |: 或
    • (?:\.[^\\"]*))*:匹配转义字符后跟0个或多个non-quote、non-backslash字符
  • \":比赛结束"
  • ): 结束捕获组#1