2015-12-17 264 views
-2

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

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]); 
     } 
} 

}

上面的代码只生成了一些测试用例正确的输出,在其他情况下,也不会产生正确的one.For例如, 考虑下面的字符串,它没有得到预期的输出。

了它的输出:

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],对吗?

+4

可能的重复[如何在Java中拆分字符串](http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java) – Tushar

+1

@Tushar和其他人:问题你称之为“重复”是由不知道split()的人发布的。这位提问者知道'split'并且无法正确地获取分隔符。这不是重复的。 – ajb

+0

在给定场景下,StringTokenizer更合适。尽管它已被扫描器和拆分方法所取代。 –

回答

2

在这一行:

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

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

\字符出现在模式字符串:

  1. 如果下面的字符是字母或数字,该组合具有一些特殊的意义(例如,你在字符串中使用\s意思空格),
  2. 如果下面的字符不是字母和数字的其他东西,这意味着对待后面的字符作为本身。该角色可能具有的任何特殊含义被取消

它看起来像你正在尝试使用[!\s]+(在模式;当然,你不得不把字符串字面的反斜杠双)在一套!和空白匹配一个或多个字符。在这里,[]具有特殊含义,以匹配集合中的任何字符。但在[取消[的特殊含义之前加上\,并使匹配器在输入中查找[,它找不到它。

查看this javadoc了解更多信息。

我不确定,但我认为摆脱所有\\之前,每个[将使事情工作。这种模式仍然会比所需要的更加复杂(并且我不能100%清楚要求是什么,所以我很难提出改进建议)。

+0

感谢@ajb。请勿指定确切的要求。因为我刚开始使用Java。在试图解决这个问题之前,我应该先看看javadoc。在每个'['已经准确地为所有可能的测试案例工作之前,去除那些'\'。再次感谢。 :) – Batman25663

0

只是做配套,而不是分裂..

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

你可以试试这个:

String str = "Hello, thanks for attempting this problem! Hope it will help you to learn java! Good luck and have a nice day!"; 
//String[] split = str.split("[\\p{Punct}\\s+]"); 
String[] split = str.split("[\\p{Punct}\\p{Blank}]+"); 
System.out.println("Arrays.toString(split) = " + Arrays.toString(split)); 

结果是:

Arrays.toString(split) = [Hello, thanks, for, attempting, this, problem, Hope, it, will, help, you, to, learn, java, Good, luck, and, have, a, nice, day] 

Eited:下面

编辑的行
String[] split = str.split("[\\p{Punct}\\p{Blank}]+"); 
相关问题