繁体   English   中英

在Java中以特定模式分割字符串

[英]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对,并将匹配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("--------");
}

如果要使用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”,并且

[ ]*:[ ]* 

用正则表达式分割字符串,并说空格(一个或多个):空格(一个或多个)作为定界符。

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

 ?: ?

http://regexr.com/39evh

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM