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

时间:2012-12-05 00:46:43

标签: java regex string split

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:12)

您可以尝试 \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"]

答案 1 :(得分:2)

这里已有几个答案,但没有一个能很好地解决国际化问题。即使从OP示例中可以假设它是关于"英语"对于来自搜索的访客而言,情况可能并非如此......

...所以,值得一提的是Java支持Unicode Technical Standard #18 "Unicode Regular Expressions"。令人印象深刻的不是吗?很明显,这是对经典(以拉丁为中心或以英语为中心)的正则表达式的扩展,用于处理国际字符。

例如,Java supports the full set of binary properties检查某个字符是否属于某个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的语言拼写的单词(包括supplementary multi-lingual plane)< / p>

答案 2 :(得分:0)

岂不

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

工作?

答案 3 :(得分:0)

除了其他答案之外,你可以迭代字符串中的字符,测试它们的ASCII值是否在大写字母和大写字母的范围内,并执行你想要的分割&#39;行为,如果没有。

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

答案 4 :(得分:0)

在拆分功能中使用方括号[],我们可以做到这一点,

SYNTAX: 字符串strArray = text.split(“ [^ a-zA-Z0-9]”);

例如: ->输入文字:“准备,稳定,出发!”;

字符串数组应为strArray = [Ready,steady,go];

例如: ->输入文字:“您是最棒的!!!!!!!!!!”

字符串数组应为strArray = [您,是最好的CodeFighter,永远];