2012-12-05 108 views
5

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

"Here is an [email protected]" => "Here", "is", "an" "ex", "mple" 

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

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

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

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

+0

\ W +是否工作? – Thilo

+0

http://stackoverflow.com/questions/11332772/java-string-split-on-all-non-alphanumeric-except-apostrophes –

+0

@Thilo这将无法与下划线 – arshajii

回答

11

你可以尝试\P{Alpha}+

"Here is an [email protected]".split("\\P{Alpha}+") 
 
["Here", "is", "an", "ex", "mple"] 

\P{Alpha}匹配任何非字母字符(而不是\p{Alpha},它匹配任何字母字符)。 +表示我们应该分割任何连续的字符串。例如:

"[email protected]#$%^&*b".split("\\P{Alpha}+") 
 
["a", "b"] 
+0

完美的工作。感谢您的建议和解释! – dmoench

+0

如果我放入“女士,我是亚当”,它会杀死逗号和撇号,但在“女士”之后和“我”之前保留空格。这是预期的行为,还是分裂的东西?如果我添加“| \\ s +”,它不会杀死空白。 – Ungeheuer

0

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

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

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()); 
    } 

或者用拆分对 -alphabetic字符打破大多相当于:

for (String s : "L'élève あゆみ travaille bien".split("\\P{IsAlphabetic}+")) 
     System.out.println(">" + s); 

在这两种情况下,输出将正确令牌化的话,考虑到法国加剧字符和日语平假名字符 - 就像它使用任何支持Unicode的语言拼写的单词一样(包括supplementary multi-lingual plane