如何在java中使用分隔符拆分字符串?

时间:2015-12-17 06:19:04

标签: java regex string split

我需要传递给String.split()方法的什么正则表达式模式,使用空格以及后面的字符作为分隔符将字符串拆分为子字符串数组。 (" ! ", " , " , " ? " , " . " , " \ " , " _ " , " @ " , " ' " )它也可以是上述字符与空格的组合。我尝试过这样的事情:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class StringWordCount {
    public static void main(String[] args) throws IOException {

      BufferedReader bufferedReader = new BufferedReader(new IputStreamReader(System.in));
      String string = bufferedReader.readLine();
      String delimiter = "[,\\s]+|\\[!\\s]+|\\[?\\s]+|\\[.\\s]+|\\[_\\s]+|\\[_\\s]+|\\['\\s]+|\\[@\\s]+|\\!|\\,|\\?|\\.|\\_|\\'|\\@";
      String[] words = string.split(delimiter);
      System.out.println(words.length);
      for(int i = 0; i<words.length; i++) {
         System.out.println(words[i]);
      }
}

}

上面的代码只为某些测试用例生成正确的输出,在其他情况下,它不会生成正确的输出。例如, 考虑下面的字符串,它无法获得预期的输出。

它生成输出:

23
Hello
thanks
for
attempting
this
problem

Hope
it
will
help
you
to
learn
java

Good
luck
and
have
a
nice
day

而不是这一个:

21
Hello
thanks
for
attempting
this
problem
Hope
it
will
help
you
to
learn
java
Good
luck
and
have
a
nice
day

正如您在第一个输出中看到的那样,它在" ! "[space]的组合上留出一个空格,而上述组合的分隔符是\\[!\\s],对吧?

2 个答案:

答案 0 :(得分:2)

在这一行:

String delimiter = "[,\\s]+|\\[!\\s]+|\\[?\\s]+|\\[.\\s]+|\\[_\\s]+|\\[_\\s]+|\\['\\s]+|\\[@\\s]+|\\!|\\,|\\?|\\.|\\_|\\'|\\@";

你在字符串文字中有\\[,这意味着该模式中有两个字符\[。在模式匹配器中,这会导致匹配器查找[字符。这不是你想要的。

当模式字符串中出现\字符时:

  1. 如果以下字符是字母或数字,则该组合具有一些特殊含义(例如,您在字符串中使用\s表示空格),
  2. 如果以下字符不是字母或数字,则表示将以下字符视为。该角色可能具有的任何特殊含义将被取消
  3. 看起来您正在尝试使用[!\s]+(在模式中;当然您必须将字符串文字中的反斜杠加倍)以匹配{{1}中的一个或多个字符和空白。在这里,![具有特殊含义,可以匹配集合中的任何字符。但是在]之前放\会取消[的特殊含义,并导致匹配器在输入中查找[,但它找不到

    有关详细信息,请参阅this javadoc

    我不确定,但我认为在每个[之前摆脱所有\\会让事情发挥作用。这种模式仍然比必要的复杂(我并不是100%明确要求是什么,所以我很难建议改进)。

答案 1 :(得分:0)

只是做匹配而不是拆分..

ArrayList<String> lst = new ArrayList<String>();
Matcher m = Pattern.compile("\\w+").matcher(s);
while(m.find()) {
    lst.add(m.group());
  }