2014-09-06 59 views
2

一定的模式,我写了包含下列字符串模式文件的解析器的字符串:分割在Java

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

我能够通过一个检索这些行一个成一个列表。我想要做的是将键和每个字符串的值分开。我知道有split()方法可以采用正则表达式并为我做这件事,但我对他们很不熟悉,所以我不知道正则表达式要作为split()函数的参数。

此外,虽然不是我解析该文件的规范,我想为正则表达式能够识别以下模式以及(如果可能):

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

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

回答

4

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

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

在这种情况下,split("\\s*:\\s*")应该做的伎俩。

说明:

  • \\s表示任何空白
  • *意味着元件的一次或多次出现描述它
  • \\s*意味着零个或多个空格之前。

在你可能想也发现整个key:value对和地方部分在不同的组匹配keyvalue(你甚至可以命名组,就如同使用(?<groupName>regex))另一方面。在这种情况下,你可以使用

Pattern p = Pattern.compile("(?<key>\\w+)\\s*:\\s*(?<value>\\w+)"); 
Matcher m = p.matcher(yourData); 
while(m.find()){ 
    System.out.println("key = " + m.group("key")); 
    System.out.println("value = " + m.group("value")); 
    System.out.println("--------"); 
} 
1

可以使用分割方法,但可以通过分隔符为“:”

此拆分字符串时,看到“:”,然后你可以修剪的值来获取键和值。

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()将字符串前后空格去掉(如果您有它在你的情况下),所以刺将成为“键:值”和

[ ]*:[ ]* 

分裂带正则表达式的字符串表示空格(一个或多个):空格(一个或多个)作为分隔符。

0

对于一个纯粹的正则表达式的解决方案,你可以用以下方式(注意开头的空格):

?: ? 

http://regexr.com/39evh

+0

为什么使用'?'代替 '*'?你只想要零或一个''匹配? – msrd0 2014-09-06 19:28:18

+0

这真的取决于问题的细节 - 如果可以存在多个空间,则使用*。 – Matthias 2014-09-06 19:29:49

+0

但'*'会匹配与'?'匹配的所有内容,所以我看不出有什么理由使用'?'在这种情况下 – msrd0 2014-09-06 19:32:15

2

如果你想使用String.split(),你可以使用这个:

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

这会sp在“:”处点亮字符串,但将“:”前面的所有空白字符添加到该字符串中,以便您将收到修剪过的字符串。

说明:

  • \\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*之间的:意味着你:需要在那里
  • 最后一组,.+,将匹配任何字符串,包括空格等等。
-1
String[] tokensVal = str.split(":"); 
String key = tokensVal[0].trim(); 
String value = tokensVal[1].trim(); 
+0

这不会编译,你不能重新定义局部变量'key'。 – msrd0 2014-09-06 19:18:37

+0

我知道,这只是一个概念,表明它是如何完成的。 – 2014-09-06 19:23:43

+0

但OP无法从无证和不可编译的(在_Pshemo_编辑您的答案之前)代码学习 – msrd0 2014-09-06 19:26:37