繁体   English   中英

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

[英]Splitting a string using RegEx matches instead of delimiters

我想分割一个这样的字符串: "1.2 5"被标记为{"1", ".", "2", "5"} (顺序很重要),我试图用String.split()使用以下正则表达式: ([0-9])\\w*|\\. 但这是我想要匹配的,而不是分隔符。

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

更多例子:

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

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

"1 2.800" => {"1", "2", "." "800"} {"1", "2", "." "800"}

我宁愿收集所有与非数字和非空白符号[^\\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演示

图案细节

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

这是一个正则表达式演示

这个正则表达式应该工作( 演示 ):

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

它通过分割字符串中的位置来工作:

  • 下一个字符是文字. (lookahead)和前面的字符不是空格(负面的lookbehind)
  • 前面的字符是文字. (向后看)
  • 有一个或多个空格字符

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

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


回应你对正则表达式(?<! )部分的评论。 没有那个部分,模式匹配每个空格字符,以及每个空格字符之前的位置. 每一次之后. 你的一个例子有一个空格后跟一个. (例如"2 .8" )会像这样分裂:

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

注意第二个位置的空字符串。 这是因为它已经在空间上分裂,然后在a之前找到了一个位置. ,也分开了。 (?<! )通过说“仅在a之前拆分.如果它之前没有空格字符”来阻止这种情况。

你不需要正则表达式匹配,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

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

暂无
暂无

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

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