使用RegEx匹配而不是分隔符拆分字符串

时间:2016-08-05 10:59:26

标签: java regex string

我想分割一个这样的字符串:"1.2 5"被标记为{"1", ".", "2", "5"}(顺序很重要),我试图使用以下正则表达式String.split()执行此操作:{{ 1}}但这是我想要匹配的,而不是分隔符。

是否有其他方法可以做到这一点?甚至可以将两个连接的单词分开,同时保持两个完整吗? (例如拆分" 1.2"如上例所示)

更多例子:

([0-9])\w*|\. => "1 2 8"

{"1", "2", "8"} => "1 122 .8"

{"1", "122", "." "8"} => "1 2.800"

3 个答案:

答案 0 :(得分:1)

我宁愿收集所有带有[^\d\s]的非数字和非空白符号以及带有\d的数字:

String s = "1.2 5";
Pattern pattern = Pattern.compile("\\d+|[^\\d\\s]+");
Matcher matcher = pattern.matcher(s);
List<String> lst = new ArrayList<>();
while (matcher.find()){
    lst.add(matcher.group(0));
} 
System.out.println(lst);  // => [1, 122, ., 8]

请参阅Java demo

模式详情

  • \d+ - 一位或多位
  • | - 或
  • [^\d\s]+ - 除空白或数字之外的一个或多个字符

这是一个regex demo

答案 1 :(得分:1)

此正则表达式应该有效(demo):

s.split("(?=\\.)(?<! )|(?<=\\.)| +")

它通过分割字符串中的位置来实现:

  • 下一个字符是文字​​.(前瞻),前面的字符是一个空格(负面的后视)
  • 前面的字符是文字​​.(lookbehind)
  • 有一个或多个空格字符

java split函数删除字符串的任何匹配部分。在前瞻/后瞻匹配的情况下,它们是零宽度,因此拆分在拆分时实际上不消耗任何字符串。零宽度匹配基本上只标记字符串中要分割的位置。

此解决方案适用于您提供的所有示例,它也适用于多个空间。这是demo

回复您对正则表达式(?<! )部分的评论。没有该部分,该模式匹配每个空格字符,以及每个.之前和每.之后的位置。您的一个示例中有一个空格,后跟.(例如"2 .8"),它会像这样分开:

["2", "", ".", "8"]

注意第二个位置的空字符串。这是因为它在空间上分裂,然后在.之前找到了一个位置,并在那里分开。 (?<! )通过说&#34;仅在.之前拆分,如果它前面没有空格字符,则会阻止此操作。

答案 2 :(得分:1)

你不需要正则表达式匹配,java有一个内置的StringTokenizer就是为了这个。

试试这个:

StringTokenizer st = new StringTokenizer("1.2 5", ". ");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

输出:

1
2
5

编辑:如果要包含分隔符,请使用新的StringTokenizer(字符串,分隔符,returnDelims = true)。在这种情况下,输出是:

1
.
2

5

如果您只想返回点,而不是空格,请在循环中跳过它。