我想分割一个这样的字符串:"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"
答案 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
如果您只想返回点,而不是空格,请在循环中跳过它。