【问题标题】:Error when splitting a string in java在java中拆分字符串时出错
【发布时间】:2013-09-15 22:28:40
【问题描述】:

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

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"

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

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

【问题讨论】:

  • 为什么不直接删除上一步中的所有引号?

标签: java regex split string-split


【解决方案1】:

很遗憾,您将无法仅使用 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'

【讨论】:

  • 感谢您解释我的角色类中的问题。我是使用正则表达式的新手。这正是我想要的。
【解决方案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 的答案,我意识到他对您的正则表达式是正确的。在括号内不必指定空格字符的数量,因为它们将被 + 运算符捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2012-03-21
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多