Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java分割正则表达式_Java_Regex_String Split - Fatal编程技术网

Java分割正则表达式

Java分割正则表达式,java,regex,string-split,Java,Regex,String Split,给定一个字符串S,查找该字符串中的字数。对于这个问题,单词由一个或多个英文字母组成的字符串定义 注意:空格或任何特殊字符如![,?.\\'@+]将用作分隔符 输入格式:字符串将只包含小写英文字母、大写英文字母、空格和以下特殊字符:![,?.'@+] 输出格式:在第一行,打印字符串中的字数。单词不需要是唯一的。然后,将每个单词单独打印一行 我的代码: Scanner sc = new Scanner(System.in); String str = sc.nextLine();

给定一个字符串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]);
Scanner sc=新扫描仪(System.in);
字符串str=sc.nextLine();
String regex=“(|!|[|,|?|.| | | | |+|]| \\)+”;
字符串[]arr=str.split(regex);
系统输出打印长度(arr.length);
对于(int i=0;i

当我提交代码时,它只适用于一半以上的测试用例。我不知道测试用例是什么。我在寻求关于墨菲定律的帮助。我实现的正则表达式在什么情况下不起作用?

您不能在正则表达式中转义一些特殊字符。让我们从
[]
开始。因为没有转义它们,所以部分
[|,|?|.| | | |'|@|+|]
被视为一组字符
,?。|+
。这意味着您的正则表达式不会在
[
]
上拆分

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

您可以通过转义这些字符来解决此问题。这将迫使您转义更多字符,并最终得到正确的定义:

String regex = "( |!|\\[|,|\\?|\\.|_|'|@|\\+|\\])+";
请注意,您可以使用一个集合来代替定义替代项,该集合将使您的正则表达式更易于阅读:

String regex = "[!\\[,?._'@+\\].]+";
在这种情况下,您只需要转义
[
]

更新:

特殊字符的前导也有问题(如您的示例中的
”。您好,这里是[broski.]@@@@@“
)。您需要对其进行拆分,但它会在结果中生成一个空字符串。我认为没有办法在不生成拆分函数的情况下使用拆分函数,但您可以通过在使用相同的正则表达式进行拆分之前删除第一个组来缓解此问题:

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

为什么要在正则表达式中包含反斜杠?这不在要求中。此外,您使用的是
[
]
,而没有转义。对于正则表达式中具有特殊含义的字符,您需要转义。作为旁注,您可能会发现基于字符集(例如,
[a-z])进行拆分更容易、更清晰
是所有小写字母的集合),而不是一系列的X、Y或Z大小写。我很抱歉。我不知道我必须避开反斜杠才能将其发布到这里。我感谢您的回复。我测试了输入“.Hi?there[broski.]@@@@@@@”,没有引号。输出打印出4个,一个空行,Hi,there,broski(每个都在自己的行上)我猜它是在“嗨”前面的“.'”上打印出来的。我怎么解决这个问题?