我想将一个字符串沿非字母表字符分割成一个字符串数组。 例如,我想把一个字符串沿非字母表字符分割成一个字符串数组。
"Here is an ex@mple" => "Here", "is", "an" "ex", "mple"
我试着用 String.split(String regex) 方法,并使用正则表达式 "(?![\\p{Alpha}])"
. 然而,这将字符串分割成
"Here", "_is", "_an", "_ex", "@ample"
这些下划线是为了强调有一个空格)。我想这是因为 ?!
regex运算符为 "零宽度",实际上是对输入字符串中的非字母字符前的零宽度字符进行分割和删除。
如何在拆分字符串的同时完成实际非α字符的删除?有没有一个非零宽度的否定运算符?
你可以尝试 \P{Alpha}+
:
"Here is an ex@mple".split("\\P{Alpha}+")
["Here"、"is"、"an"、"ex"、"mple"]
\P{Alpha}
匹配任何非字母表字符(相对于 \p{Alpha}
匹配任何字母字符)。) +
表示我们应该在任何连续的此类字符串上进行分割。例如:["a", "b"]。
"a!@#$%^&*b".split("\\P{Alpha}+")
["a", "b"]
这里已经有好几个答案了,但都没有很好地解决国际化问题。即使从上面的例子中可以假设这是关于 "英文 "字母的问题,但对于通过搜索来到这里的访问者来说,情况可能不是这样......
...所以,值得一提的是,Java支持的是 統一碼技術標準#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来打断 非在这两种情况下,输出将正确地对单词进行标记化,同时考虑到法语重音字符和日语平假名字符--就像对使用任何Unicode支持的语言拼写的单词一样(包括使用Unicode支持的语言)。
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();
也许会有用。
使用Split函数中的方括号[]我们可以这样做,。
SYNTAX : String strArray = text.split("[^a-zA-Z0-9]")。
例如:--> 对于文本:"Ready, steady, go!"。
字符串数组将是,,strArray = [Ready,steady,go]。
For Example:--> for text : "You are the best!!!!! CodeFighter ever!"。
字符串数组将是,,,strArray = [You,are,the,best,CodeFighter,ever]。