1 回答
TA贡献1801条经验 获得超8个赞
而不是拆分,你应该更喜欢使用find这个正则表达式来找到你想要的所有标记,
[a-zA-Z]+(['][a-zA-Z]+)?
这个正则表达式只允许在其中夹入一个'。如果你想允许任何其他这样的字符,只需将它放在字符集中['],现在它只允许一次,如果你想允许多次,你必须?在最后改变 a*使其为零或更多次。
签出您修改后的 Java 代码,
List<String> tokenList = new ArrayList<String>();
String str = "..Hello ?don't #$you %know?";
Pattern p = Pattern.compile("[a-zA-Z]+(['][a-zA-Z]+)?");
Matcher m = p.matcher(str);
while (m.find()) {
tokenList.add(m.group());
}
String[] strArray = tokenList.toArray(new String[tokenList.size()]);
for (int i = 0; i < strArray.length; i++) {
System.out.println(strArray[i] + i);
}
印刷,
Hello0
don't1
you2
know3
但是,如果您坚持split只使用方法,那么您可以使用此正则表达式来拆分值,
[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+
它基本上将字符串拆分为一个或多个空格,可选地由非字母字符包围或按一个或多个非字母和非单引号字符的序列拆分。这是使用 split 的示例 Java 代码,
String str = ".. Hello ?don't #$you %know?";
String[] strArray = Arrays.stream(str.split("[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+")).filter(x -> x.length()>0).toArray(String[]::new);
for (int i = 0; i < strArray.length; i++) {
System.out.println(strArray[i] + i);
}
印刷,
Hello0
don't1
you2
know3
请注意,我在流上使用了过滤器方法来过滤零长度的令牌,因为拆分可能会在数组的开头生成零长度的令牌。
添加回答
举报