2016-01-21 184 views
2

给定一个字符串S,找到该字符串中的字数。对于这个问题,一个单词由一个或多个英文字母串组成。Java拆分正则表达式

注意:空格或任何特殊字符,如![,?。\ _'@ +]将作为分隔符。输入格式:该字符串只包含小写英文字母,大写英文字母,空格和这些特殊字符:![,?._'@ +]。

输出格式:在第一行,打印字符串中的字数。这些词不需要是唯一的。然后,在单独的一行中打印每个单词。

我的代码:

Scanner sc = new Scanner(System.in); 
    String str = sc.nextLine(); 
    String regex = "(|!|[|,|?|.|_|'|@|+|]|\\\\)+"; 
    String[] arr = str.split(regex); 

    System.out.println(arr.length); 

    for(int i = 0; i < arr.length; i++) 
     System.out.println(arr[i]); 

当我提交的代码,它工作的测试用例刚刚超过一半。我不知道测试用例是什么。我正在寻求墨菲定律的帮助。我所实施的正则表达式不起作用的情况是什么?

+4

为什么你包括你的正则表达式反斜线?这不符合要求。另外,你正在使用'['和']'而不逃避它们。 –

+3

对于在正则表达式中有特殊含义的字符,您需要将它们转义。作为一个附注,你可能会发现从一个字符集(例如,'[a-z]'是全部小写字母的集合)而不是一系列X或Y或Z情况下拆分会更容易和更清晰。 – Vulcan

+0

我道歉。不知道我必须逃避反斜杠才能在此发布。 – juice

回答

1

你不会在你的正则表达式中转义一些特殊字符。我们从[]开始。既然你不逃避它们,[|,|?|.|_|'|@|+|]的部分被视为一组字符|,?._'@+。这意味着您的正则表达式不会在[]之间分割。

例如x..]y+[z被分成x,]y[z

你可以通过转义这些字符来解决这个问题。这将迫使你逃过更多的人,你最终有一个适当的定义:

String regex = "(|!|\\[|,|\\?|\\.|_|'|@|\\+|\\])+"; 

注意,而不是定义选择,您可以使用一组,这将使你的正则表达式更容易阅读:

String regex = "[!\\[,?._'@+\\].]+"; 

在这种情况下,您只需要转义[]

UPDATE:

还有用(在你的例子".Hi?there[broski.]@@@@@"等)导致特殊字符的问题。你需要分割它,但它会在结果中产生一个空字符串。我不认为有使用分割功能而不创造一种方式,但你可以通过使用相同的正则表达式分裂之前除去第一组减轻它:

String[] arr = str.replaceFirst(regex, "").split(regex); 
+0

我很感谢您的回复。我做了一个“.Hi?there [broski。] @@@@@”的测试输入,没有引号。输出打印出4,一个空行,嗨,那里,broski(每个都有自己的行)。我认为它打印出空白行,因为'。'在“Hi”前面。我将如何解决这个问题? – juice

+0

是的,没错。查看我的更新。 – Szymon