当我们String.Split()
在一个字符串上使用方法在java中进行拆分时,它的工作原理如下:
String s = "hello my dear";
String[] ss = s.split("[ ]");
在这种情况下,数组ss
包含[Hello, my, dear]
但空格(它们是分隔符)不是数组的一部分。
是否有某种方式可以使分隔符成为使用 Java 中字符串类的 split 方法生成的数组的一部分。
你可以这样做: -
"hello my dear".split("(?<=[ ])");
它在空格之后拆分为一个空字符串。这将为您提供包含以下元素的数组:-
hello_
my_
dear
_
是空间的意思。
如果你希望你的分隔符是单独的数组元素,你可以这样做: -
System.out.println(Arrays.toString("a+b=c".split("(?<=[+=])|(?=[+=])")));
现在,这将拆分为空字符串,该字符串要么紧随其后,要么紧随+ or =
其后+ or =
。因此,针对上述情况执行拆分的所有位置都是这样的:-
a + b = c
^ ^ ^ ^ <-- Empty strings before and after your pattern - `[+=]`
因此,您的数组中有 5 个元素。
输出: -
[a, +, b, =, c]
但是您使用了错误的工具来解析数学表达式。您不应该为此使用正则表达式。
使用StringTokenizer 的重载构造函数:
String s = "hello my dear";
StringTokenizer st = new StringTokenizer(s, " ", true);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
输出:
hello
my
dear
您可以在单词边界上进行拆分。
String[] ts = "hello my dear".split("\\b");
System.out.println(Arrays.toString(ts));
[, hello, , my, , dear]
或者
public String[] getParts(String s) {
List<String> parts = new ArrayList<String>();
Pattern pattern = Pattern.compile("(\\w+|\\W)");
Matcher m = pattern.matcher(s);
while (m.find()) {
parts.add(m.group());
}
return parts.toArray(new String[parts.size()]);
}
这与每个查找单词\\w+
(小 w)或非单词字符\\W
(大写 W)匹配。