使用 Regex (Java) 在 key=value 组中拆分字符串

Splitting the string in key=value groups using Regex (Java)

我不是正则表达式专家,这就是为什么我请你建议一种在键=值组中拆分此字符串的有效方法。

输入字符串:

x-x="11111" y-y="John-Doe 23" db {rty='Y453'} code {codeDate='2000-03-01T00:00:00'}

我需要的是获取键=值对:

key=x-x, value="11111"
key=y-y, value="John-Doe 23"
key=rty, value='Y453'
key=codeDate, value='2000-03-01T00:00:00'

我的解决方案在这里,但我担心它不是最简单的。

String str = "x-x=\"11111\" y-y=\"John-Doe 23\" db {rty='Y453'} code {codeDate='2000-03-01T00:00:00'}";
Matcher m = Pattern.compile("(\w+-*\w*)=((\"|')(\w+( |-|:)*)+(\"|'))").matcher(str);

while(m.find()) {
    String key = m.group(1);
    String value = m.group(2);
    System.out.printf("key=%s, value=%s\n", key, value);
}

在此先感谢您的帮助。

您可以将此正则表达式与 3 个捕获组和一个反向引用一起使用:

([\w-]+)=((['"]).*?)

RegEx Demo

RegEx Breakup:
  • ([\w-]+): 匹配并捕获第 1 组中的键名
  • =:匹配=
  • (:开始第 2 组
    • (['"]):匹配并捕获组 #3
    • 中的引用
    • .*?:匹配0个或多个任意字符(惰性匹配)
    • </code>:向后引用第 3 组以匹配相同类型的结束引号</li> </ul></li> <li><code>):捕获组 #2 结束

    您将在 .group(1).group(2) 中找到匹配项。

对于第 1 组中单引号和双引号值之间的 select 个值

String ResultString = null;
try {
    Pattern regex = Pattern.compile("[\"'](.*?[^\\])[\"']", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE);
    Matcher regexMatcher = regex.matcher(subjectString);
    if (regexMatcher.find()) {
        ResultString = regexMatcher.group(1);
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}