3

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

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"

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

编辑:我刚刚意识到当任何定界符用作字符串的第一个字符时我有同样的问题

4

2 回答 2

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'
于 2013-09-15T22:45:01.847 回答
2

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

如何防止 java.lang.String.split() 创建前导空字符串?

因此,简而言之,您将拥有:

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

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

于 2013-09-15T22:41:18.330 回答