10

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

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

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

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

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

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

4

5 回答 5

20

你可以试试\P{Alpha}+

"Here is an ex@mple".split("\\P{Alpha}+")
[“这里”、“是”、“一个”、“前”、“mple”]

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

"a!@#$%^&*b".split("\\P{Alpha}+")
[“a”,“b”]
于 2012-12-05T01:05:09.337 回答
5

这里已经有几个答案,但没有一个能很好地处理国际化问题。即使可以从 OP 示例中假设它是关于“英文”字母的,但对于通过搜索来到这里的访问者来说可能并非如此......

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

例如,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 的语言(包括补充的多语言平面)拼写的单词一样

于 2015-10-29T13:14:40.080 回答
0

不会

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

工作?

于 2012-12-05T01:24:22.830 回答
0

除了其他答案之外,您还可以遍历字符串中的字符,测试它们的 ASCII 值是否在小写和大写字母的范围内,如果不是,则执行您想要的“拆分”行为。

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

于 2014-09-29T15:19:29.657 回答
0

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

语法:字符串 strArray = text.split("[^a-zA-Z0-9]");

例如: --> for text : "Ready, stable, go!";

字符串数组将是,strArray = [Ready,steady,go];

例如:--> for text:“你是最棒的!!!!!!!!!!!!CodeFighter ever!”;

字符串数组将是,strArray = [You,are,the,best,CodeFighter,ever];

于 2020-05-12T05:24:45.000 回答