使用Java Regex Pattern解析字符串?

Bha*_*ddy 4 java regex string pattern-matching

我有以下格式的以下java字符串.

String s = "City: [name:NYK][distance:1100] [name:CLT][distance:2300] [name:KTY][distance:3540] Price:"
Run Code Online (Sandbox Code Playgroud)

使用java.util.regex包问题和模式类,我必须得到以下格式的输出字符串:

Output: [NYK:1100][CLT:2300][KTY:3540]
Run Code Online (Sandbox Code Playgroud)

你能建议一个可以帮助我获得上述输出格式的RegEx模式吗?

YCF*_*F_L 9

你可以\[name:([A-Z]+)\]\[distance:(\d+)\]像这样使用这个正则表达式:

String regex = "\\[name:([A-Z]+)\\]\\[distance:(\\d+)\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);

StringBuilder result = new StringBuilder();
while (matcher.find()) {                                                
    result.append("[");
    result.append(matcher.group(1));
    result.append(":");
    result.append(matcher.group(2));
    result.append("]");
}

System.out.println(result.toString());
Run Code Online (Sandbox Code Playgroud)

产量

[NYK:1100][CLT:2300][KTY:3540]
Run Code Online (Sandbox Code Playgroud)
  • 正则表达式演示
  • \[name:([A-Z]+)\]\[distance:(\d+)\]意思是得到两组,一组是上面的字母\[name:([A-Z]+)\],第二组后得到数字\[distance:(\d+)\]

来自@tradeJmark的另一个解决方案你可以使用这个正则表达式:

String regex = "\\[name:(?<name>[A-Z]+)\\]\\[distance:(?<distance>\\d+)\\]";
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过组的名称轻松获取每个组的结果,而不是像这样的索引:

while (matcher.find()) {                                                
    result.append("[");
    result.append(matcher.group("name"));
    //----------------------------^^
    result.append(":");
    result.append(matcher.group("distance"));
    //------------------------------^^
    result.append("]");
}
Run Code Online (Sandbox Code Playgroud)

  • 我几乎完全会做到这一点。我唯一的补充(这在某种程度上是一个优先事项)是可以命名捕获组,例如`name:(?&lt;name&gt; [AZ] +)`,然后以`matcher.group(“ name” )`。只需在访问点上明确说明您要访问的段即可。 (2认同)