在Java中拆分具有特定模式的字符串

时间:2014-09-06 19:03:58

标签: java regex string split

我正在为包含以下字符串模式的文件编写解析器:

Key : value
Key : value
Key : value
etc...

我能够将这些行逐个检索到列表中。我想要做的是将键与每个字符串的值分开。我知道有split()方法可以使用正则表达式并为我做这个,但我对它们非常不熟悉所以我不知道正则表达式作为参数给split()函数

此外,虽然不在我正在解析的文件的规范中,但我希望Regex能够识别以下模式(如果可能):

Key: value
Key :value
Key:value
etc...

基本上,在:字符之前/之后/之后是否有空格,我希望Regex能够检测到它。什么是正则表达式可以实现这一目标?

5 个答案:

答案 0 :(得分:4)

换句话说,split方法应该在它之前或之后查找:和零个或多个空格。

Key: value
   ^^
Key :value
   ^^
Key:value
   ^
Key : value
   ^^^

在这种情况下,split("\\s*:\\s*")应该可以解决问题。

说明:

  • \\s代表任何空白
  • *表示在
  • 之前描述的一个或多个元素
  • \\s*表示零个或多个空格。

另一方面,您可能还需要找到整个key:value对,并将符合keyvalue的部分放在不同的组中(您甚至可以使用{{ 1}})。在这种情况下,您可以使用

(?<groupName>regex)

答案 1 :(得分:2)

如果您想使用String.split(),可以使用:

String input = "key : value";
String[] s = input.split("\\s*:\\s*");
String key = s[0];
String value = s[1];

这会将字符串拆分为“:”,但会在“:”前面添加所有空格,以便您收到剪裁后的字符串。

说明:

  • \\s*将匹配任何空格,默认情况下等于[ \\n\\r\\t]*
  • 两个:之间的\\s*表示您的:需要在那里

请注意,如果您的输入行不包含您定义的键值格式,此解决方案将导致ArrayIndexOutOfBoundsException

如果您不确定该行是否真的包含键值字符串,可能是因为您希望在文件末尾有一个空行,就像通常那样,您可以这样做:

String input = "key : value";
Matcher m = Pattern.compile("(\\S+)\\s*:\\s*(.+)").matcher(input);
if (m.matches())
{
    String key = m.group(1); // note that the count starts by 1 here
    String value = m.group(2);
}

说明:

  • \\S+匹配任何非空白字符串 - 如果它包含空格,则正则表达式的下一部分将与此表达式匹配。请注意,它周围的()标记,以便您可以通过m.group()得到它的值。
  • \\s*将匹配任何空格,默认情况下等于[ \\n\\r\\t]*
  • 两个:之间的\\s*表示您的:需要在那里
  • 最后一个组.+将匹配包含空格的任何字符串,依此类推。

答案 2 :(得分:1)

您可以使用split方法,但可以将分隔符作为“:”

传递

这会在看到':'时拆分字符串,然后您可以修剪值以获取键和值。

String s = "   keys : value   ";
String keyValuePairs[] = s.split(":");
String key = keyValuePairs[0].trim();
String value = keyValuePairs[1].trim();

您还可以使用正则表达式来简化它。

String keyValuePairs[] = s.trim().split("[ ]*:[ ]*");

s.trim()将删除字符串前后的空格(如果你的情况下是这样的话),那么sting将成为“keys:value”和

[ ]*:[ ]* 

用正则表达式将字符串拆分为空格(一个或多个):空格(一个或多个)作为分隔符。

答案 3 :(得分:0)

对于纯正则表达式解决方案,您可以使用以下模式(请注意开头的空格):

 ?: ?

请参阅http://regexr.com/39evh

答案 4 :(得分:-1)

 String[] tokensVal = str.split(":");
 String key = tokensVal[0].trim();
 String value = tokensVal[1].trim();