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

dmo*_*nch 6 java regex string split

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

"Here is an ex@mple" => "Here", "is", "an" "ex", "mple"
Run Code Online (Sandbox Code Playgroud)

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

"Here", "_is", "_an", "_ex", "@ample"
Run Code Online (Sandbox Code Playgroud)

(那些强调是强调有一个空间).我想这是因为?!正则表达式运算符是"零宽度"并且实际上是拆分并删除输入字符串中非字母字符之前的零宽度字符.

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

ars*_*jii 12

你可以尝试\P{Alpha}+:

"Here is an ex@mple".split("\\P{Alpha}+")
Run Code Online (Sandbox Code Playgroud)
["Here", "is", "an", "ex", "mple"]

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

"a!@#$%^&*b".split("\\P{Alpha}+")
Run Code Online (Sandbox Code Playgroud)
["a", "b"]


Syl*_*oux 5

这里已经有几个答案,但没有一个能很好地处理国际化问题。即使可以从 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());
    }
Run Code Online (Sandbox Code Playgroud)

或者使用 split 来打破字母字符的基本等效:

    for (String s : "L'élève ??? travaille bien".split("\\P{IsAlphabetic}+"))
        System.out.println(">" + s);
Run Code Online (Sandbox Code Playgroud)

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