[英]Splitting a string with a certain pattern in Java
我正在为包含以下字符串模式的文件编写解析器:
Key : value
Key : value
Key : value
etc...
我能够将这些行一一检索到列表中。 我想做的就是将键与每个字符串中的值分开。 我知道有可以使用Regex并为我完成此操作的split()
方法,但是我对它们非常不熟悉,因此我不知道将什么Regex作为参数提供给split()
函数。
另外,虽然不在我要解析的文件的规范中,但我希望该Regex也能够识别以下模式(如果可能):
Key: value
Key :value
Key:value
etc...
因此,基本上,无论:
字符之前/之后/之后是否有空格,我希望该Regex能够检测到它。 什么正则表达式可以实现这一目标?
换句话说, split
方法应该寻找:
并且在它之前或之后寻找零个或多个空格。
Key: value
^^
Key :value
^^
Key:value
^
Key : value
^^^
在这种情况下, split("\\\\s*:\\\\s*")
应该可以解决问题。
说明:
\\\\s
代表任何空格 *
表示之前描述的元素的一个或多个出现 \\\\s*
表示零个或多个空格。 另一方面,您可能还希望找到整个key:value
对,并将匹配key
和value
放在单独的组中(您甚至可以根据需要使用(?<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("--------");
}
如果要使用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
。
如果您不确定该行是否真正包含key-value-String,也许是因为您想要像通常那样在文件末尾有一个空行,您可以这样做:
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*
意味着你:需要在那里 .+
将匹配包含空格等的任何字符串。 您可以使用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()将删除字符串前后的空格(如果您的情况下有空格),则字符串将变为“ keys:value”,并且
[ ]*:[ ]*
用正则表达式分割字符串,并说空格(一个或多个):空格(一个或多个)作为定界符。
String[] tokensVal = str.split(":");
String key = tokensVal[0].trim();
String value = tokensVal[1].trim();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.