给定一个字符串S,找到该字符串中的单词数。对于这个问题,一个单词由一个或多个英文字母的字符串定义。
注意:空格或任何特殊字符如![,?。\ _'@ +]将作为分隔符。
输入格式:字符串只包含小写英文字母,大写英文字母,空格和这些特殊字符:![,?。_'@ +]。
输出格式:在第一行,打印字符串中的单词数。这些词不需要是唯一的。然后,在单独的行中打印每个单词。
我的代码:
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]);
当我提交代码时,它适用于超过一半的测试用例。我不知道测试用例是什么。我正在寻求Murphy定律的帮助。我实施的正则表达式不起作用的情况是什么?
答案 0 :(得分:1)
你没有逃避你的正则表达式中的一些特殊字符。让我们从[]
开始。由于您没有对它们进行转义,因此将[|,|?|.|_|'|@|+|]
部分视为一组字符|,?._'@+
。这意味着您的正则表达式不会在[
和]
上分开。
例如,x..]y+[z
分为x
,]y
和[z
。
您可以通过转义这些字符来解决这个问题。这将迫使你逃避更多的这些并最终得到一个正确的定义:
String regex = "( |!|\\[|,|\\?|\\.|_|'|@|\\+|\\])+";
请注意,您可以使用一个可以让正则表达式更容易阅读的集合,而不是定义替代方案:
String regex = "[!\\[,?._'@+\\].]+";
在这种情况下,您只需要转义[
和]
。
更新:
领先的特殊字符也存在问题(例如在您的示例".Hi?there[broski.]@@@@@"
中)。你需要拆分它,但它会在结果中产生一个空字符串。我不认为有一种方法可以使用split函数而不生成它,但是你可以通过在使用相同的正则表达式进行拆分之前删除第一个组来缓解它:
String[] arr = str.replaceFirst(regex, "").split(regex);