非字母字符上的Java字符串拆分

我想沿着非字母字符将String拆分为String数组。 例如:

"Here is an ex@mple" => "Here", "is", "an" "ex", "mple" 

我尝试使用String.split(String regex)方法和正则表达式"(?![\\p{Alpha}])" 。 然而,这将字符串拆分为

 "Here", "_is", "_an", "_ex", "@ample" 

(那些强调是强调有一个空间)。 我猜这是因为?! 正则表达式运算符是“零宽度”,实际上是在输入字符串中的非字母字符之前拆分和删除零宽度字符。

在分割字符串时,如何完成删除实际的非字母字符? 是否存在非零宽度否定运算符?

你可以试试\P{Alpha}+

 "Here is an ex@mple".split("\\P{Alpha}+") 
 [“Here”,“is”,“an”,“ex”,“mple”]

\P{Alpha}匹配任何非字母字符(与\p{Alpha} ,匹配任何字母字符)。 +表示我们应该拆分任何连续的字符串。 例如:

 "a!@#$%^&*b".split("\\P{Alpha}+") 
 [“a”,“b”]

这里已有几个答案,但没有一个能很好地解决国际化问题。 即使可能从OP示例中假设它是关于“英文”字母,对于来自搜索的访问者来说可能不是这种情况……

…所以,值得一提的是Java支持Unicode技术标准#18 “Unicode正则表达式” 。 相当令人印象深刻的不是吗? 很明显,这是对经典(以拉丁为中心或以英语为中心的事件)正则表达式的扩展,用于处理国际字符。

例如, Java支持全套二进制属性,以检查字符是否属于Unicode代码点字符类之一。 特别是\ p {IsAlphabetic}字符类将匹配任何Unicode支持的语言中与字母对应的任何字母字符。

不清楚 ? 这是一个例子:

  Pattern p = Pattern.compile("\\p{IsAlphabetic}+"); // ^^^^^^^^^^^^^^^^^ // any alphabetic character // (in any Unicode-supported language) Matcher m = p.matcher("L'élève あゆみ travaille _bien_"); while(m.find()) { System.out.println(">" + m.group()); } 

或者大多数情况下使用split来打破字母字符:

  for (String s : "L'élève あゆみ travaille bien".split("\\P{IsAlphabetic}+")) System.out.println(">" + s); 

在这两种情况下,输出都会正确地对单词进行标记,同时考虑到法语强调字符和日语平假名字符 – 就像使用任何Unicode支持的语言拼写的单词(包括补充多语言平面 )一样

岂不

 "Here is an ex@mple".split("\\S\\w+") 

工作?

除了其他答案之外,您可以迭代字符串中的字符,测试它们的ASCII值是否在大小写字母的范围内,如果没有,则执行所需的“拆分”行为。

char[] chars = str.toCharArray(); 可能有用。