在java中拆分字符串时出错

时间:2013-09-15 22:28:41

标签: java regex split string-split

我正在尝试根据一组分隔符拆分字符串 我的分隔符是:,“():;。!?单个空格或多个空格。 这是我目前正在使用的代码,

String[] arrayOfWords= inputString.split("[\\s{2,}\\,\"\\(\\)\\:\\;\\.\\!\\?-]+");

对于大多数情况都可以正常工作,但是当第一个单词被引号括起来时我会遇到问题。例如

String inputString = "\"Word\" some more text.";

给我这个输出

arrayOfWords[0] = ""
arrayOfWords[0] = "Word"
arrayOfWords[1] = "some"
arrayOfWords[2] = "more"
arrayOfWords[3] = "text"

我希望输出给我一个带

的数组
arrayOfWords[0] = "Word"
arrayOfWords[1] = "some"
arrayOfWords[2] = "more"
arrayOfWords[3] = "text"

当在句子中间使用引号时,这段代码工作正常,我不知道它在开头时有什么问题。

编辑:我刚才意识到当任何分隔符用作字符串的第一个字符时我遇到同样的问题

2 个答案:

答案 0 :(得分:3)

不幸的是,您无法仅使用split删除此空的第一个元素。您应该从字符串中删除与分隔符匹配的第一个元素,然后将其拆分。你的正则表达式似乎也不正确,因为

  • {2,}[...]添加{ 2 , }-个字符分隔符,
  • 您不需要转义其余的分隔符(请注意,您不必仅因为它位于字符类[]的末尾而不必转义String regexDelimiters = "[\\s,\"():;.!?\\-]+"; String inputString = "\"Word\" some more text."; String[] arrayOfWords = inputString.replaceAll( "^" + regexDelimiters,"").split(regexDelimiters); for (String s : arrayOfWords) System.out.println("'" + s + "'"); ,因此无法将其用作范围运营商)。

尝试这种方式

'Word'
'some'
'more'
'text'

输出:

{{1}}

答案 1 :(得分:2)

分隔符被解释为分隔它两侧的字符串,因此左边的空字符串被添加到结果以及右边的字符串(“Word”)。为了防止这种情况,您应该首先去除任何前导分隔符,如下所述:

How to prevent java.lang.String.split() from creating a leading empty string?

所以简短形式你会:

String delim = "[\\s,\"():;.!?\\-]+";
String[] arrayOfWords = inputString.replaceFirst("^" + delim, "").split(delim);

编辑:看看Pshemo的答案,我意识到他对你的正则表达式是正确的。在括号内,没有必要指定空格字符的数量,因为它们将被捕获为+运算符。