如果转义字符位于参数值的末尾,则正则表达式创建会出现问题
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|$))|(?:\.[^\\"]*))*\")
正则表达式演示:
\"([^\"]*)\"
:匹配带引号的字符串参数名
\h*=\h*
:匹配 =
周围有可选空格
(
: 开始捕获组#1
\"
: 比赛开始"
[^\\"]*
:匹配0个或多个non-quote、non-backslash个字符
(?:
:
\
:匹配一个\
(?=\"(?:\h|$))
:必须后跟一个 "
,后面有空格或行
|
: 或
(?:\.[^\\"]*))*
:匹配转义字符后跟0个或多个non-quote、non-backslash字符
\"
:比赛结束"
)
: 结束捕获组#1
我在一个字符串中得到了三个参数。每个参数都以以下形式编写:引号、名称、引号、等号、引号、文本、引号。参数分隔符是 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|$))|(?:\.[^\\"]*))*\")
正则表达式演示:
\"([^\"]*)\"
:匹配带引号的字符串参数名\h*=\h*
:匹配=
周围有可选空格(
: 开始捕获组#1\"
: 比赛开始"
[^\\"]*
:匹配0个或多个non-quote、non-backslash个字符(?:
:\
:匹配一个\
(?=\"(?:\h|$))
:必须后跟一个"
,后面有空格或行|
: 或(?:\.[^\\"]*))*
:匹配转义字符后跟0个或多个non-quote、non-backslash字符
\"
:比赛结束"
)
: 结束捕获组#1