Java字符串分割非字母字符

10

我想将一个字符串按非字母字符拆分成一个字符串数组。例如:

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

我尝试使用String.split(String regex)方法和正则表达式"(?![\\p{Alpha}])",但是它将字符串分割成了

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

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

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


https://dev59.com/JGgu5IYBdhLWcg3wbGil - Sean F
@Thilo 这不适用于下划线。 - arshajii
5个回答

20

你可以尝试\P{Alpha}+

"Here is an ex@mple".split("\\P{Alpha}+")
["Here", "is", "an", "ex", "mple"]
"a!@#$%^&*b".split("\\P{Alpha}+")
["a", "b"]

如果我输入“Madam, I'm Adam”,它会删除逗号和撇号,但保留“Madam,”之后和“I'm”之前的空格。这是预期行为还是分割出了一些问题?如果我添加“|\s+”,它不会删除空格。 - Ungeheuer

6
这里已经有几个答案,但是它们都没有很好地处理国际化问题。即使从 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的语言(包括补充多语言平面)拼写的单词一样。

0

不会

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

工作?


0

使用方括号[]在Split函数中,我们可以这样做:

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

例如: --> 对于文本:"Ready, steady, go!";

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

例如: --> 对于文本:"You are the best!!!!!!!!!!!! CodeFighter ever!";

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


0
除了其他答案之外,您可以迭代字符串中的字符,测试它们的ASCII值是否在小写和大写字母的范围内,如果不是,则执行所需的“拆分”行为。 char[] chars = str.toCharArray(); 可能会有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接