[英]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.