我需要传递给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]
,对吧?
答案 0 :(得分:2)
在这一行:
String delimiter = "[,\\s]+|\\[!\\s]+|\\[?\\s]+|\\[.\\s]+|\\[_\\s]+|\\[_\\s]+|\\['\\s]+|\\[@\\s]+|\\!|\\,|\\?|\\.|\\_|\\'|\\@";
你在字符串文字中有\\[
,这意味着该模式中有两个字符\[
。在模式匹配器中,这会导致匹配器查找[
字符。这不是你想要的。
当模式字符串中出现\
字符时:
\s
表示空格),但 :看起来您正在尝试使用[!\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());
}