我正在为包含以下字符串模式的文件编写解析器:
Key : value
Key : value
Key : value
etc...
我能够将这些行逐个检索到列表中。我想要做的是将键与每个字符串的值分开。我知道有split()
方法可以使用正则表达式并为我做这个,但我对它们非常不熟悉所以我不知道正则表达式作为参数给split()
函数
此外,虽然不在我正在解析的文件的规范中,但我希望Regex能够识别以下模式(如果可能):
Key: value
Key :value
Key:value
etc...
基本上,在:
字符之前/之后/之后是否有空格,我希望Regex能够检测到它。什么是正则表达式可以实现这一目标?
答案 0 :(得分:4)
换句话说,split
方法应该在它之前或之后查找:
和零个或多个空格。
Key: value
^^
Key :value
^^
Key:value
^
Key : value
^^^
在这种情况下,split("\\s*:\\s*")
应该可以解决问题。
说明:
\\s
代表任何空白*
表示在\\s*
表示零个或多个空格。另一方面,您可能还需要找到整个key:value
对,并将符合key
和value
的部分放在不同的组中(您甚至可以使用{{ 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)
答案 4 :(得分:-1)
String[] tokensVal = str.split(":");
String key = tokensVal[0].trim();
String value = tokensVal[1].trim();