我的代码如下:
public class Test {
static String REGEX = ".*([ |\t|\r\n|\r|\n]).*";
static String st = "abcd\r\nefgh";
public static void main(String args[]){
System.out.println(st.matches(REGEX));
}
}
Run Code Online (Sandbox Code Playgroud)
代码输出false.在任何其他情况下,它按预期匹配,但我无法弄清楚这里的问题是什么.
您需要删除字符类.
static String REGEX = ".*( |\t|\r\n|\r|\n).*";
Run Code Online (Sandbox Code Playgroud)
你不能放入\r\n一个角色类.如果你这样做,它会被当作\r,\n作为两个独立的项目,后者又匹配任何\r或\n.你已经知道它.*不匹配任何换行符,所以.*匹配第一部分,下一个char类匹配单个字符,即\r.现在,以下字符\n将不匹配.*,因此您的正则表达式失败了.
更新:
根据您的评论,您需要这样的东西:
.*(?:[ \r\n\t].*)+
Run Code Online (Sandbox Code Playgroud)
解释:
简单来说,它是一个匹配一行、然后 1 行或多行的正则表达式。或者,只是多行文本。
.*- 除换行符外的 0 个或多个字符(?:[ \r\n\t].*)+- 匹配 1 次或多次序列的非捕获组
[ \r\n\t]- 一个空格,或者一个\r或\n或\t.*- 除换行符外的 0 个或多个字符查看演示
原答案
您可以通过两种方式修复您的模式:
String REGEX = ".*(?:\r\n|[ \t\r\n]).*";
Run Code Online (Sandbox Code Playgroud)
这样我们就可以匹配\r\n序列或字符类中的任何字符。
或者(由于字符类只匹配 1 个字符,我们可以+在其后面添加以捕获 1 个或多个:
String REGEX = ".*[ \t\r\n]+.*";
Run Code Online (Sandbox Code Playgroud)
请注意,交替使用单个字符不是一个好主意,它会降低性能。
另请注意,不应过度使用捕获组。如果您不打算使用该组的内容,请使用非捕获组 ( (?:...)),或将其删除。