2017-07-26 16 views
2

我不是regexp的专家,这就是为什么我要求您建议在key = value组中分割此字符串的有效方法。使用正则表达式分割键=值组中的字符串(Java)

输入字符串:

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

什么,我需要的是让key = value对:

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); 
} 

在此先感谢您的帮助。

+0

单引号和双引号之间的值选择值千万键总是由字母/数字,'_'和'-'字符? –

+0

键具有固定名称:'x-x','y-y','rty'和'codeDate'。但在价值可以是任何东西.. – ayscha

回答

3

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

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

RegEx Demo

RegEx Breakup: 
  • ([\w-]+):比赛和组#捕获键名1
  • =:比赛=
  • (:启动组#2
    • (['"]):匹配并捕获在组#3
    • .*?报价:匹配0或多个任意字符(懒惰匹配)
    • \3:返回参照组# 3,以匹配相同类型的闭引号
  • ):捕获组#结束2

您将在.group(1).group(2)中得到您的匹配。

+1

实际上没有正则表达式中的三个捕获组? –

+0

是的,有三个:) – anubhava

+0

谢谢你的回答。现在我意识到我的错误和解决方案的过度复杂性。 :)其实这个解决方案可以使用的替代方案([\ w-] +)=((['“])。*?(['”])) – ayscha

0

在组1

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 
} 
相关问题