我的代码如下:
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));
}
}
代码输出false
。在任何其他情况下,它按预期匹配,但我无法弄清楚这里的问题是什么。
答案 0 :(得分:5)
您需要删除字符类。
static String REGEX = ".*( |\t|\r\n|\r|\n).*";
您无法将\r\n
放入角色类。如果您这样做,它将被视为\r
,\n
作为两个单独的项目,这些项目又与\r
或\n
匹配。您已经知道.*
不匹配任何换行符,因此.*
匹配第一部分,而下一个char类匹配单个字符,即\r
。现在,以下字符\n
不会被.*
匹配,因此您的正则表达式失败了。
答案 1 :(得分:1)
<强>更新强>:
根据您的评论,您需要以下内容:
def
<强>说明强>:
简单来说,它是一个匹配行的正则表达式,然后是1行或更多行。或者,只需多行文字。
.*(?:[ \r\n\t].*)+
- 除换行符以外的0个或多个字符.*
- 非捕获组,匹配序列的1次或多次
(?:[ \r\n\t].*)+
- 空格,[ \r\n\t]
或\r
或\n
\t
- 除换行符以外的0个或多个字符请参阅demo
原始回答
您可以通过两种方式修复您的模式:
.*
这样我们匹配String REGEX = ".*(?:\r\n|[ \t\r\n]).*";
序列或字符类中的任何字符。
或者(因为角色类只匹配1个字符,我们可以在其后添加\r\n
来捕获1个或更多:
+
请参阅IDEONE demo
请注意,在替换中使用单个字符不是一个好主意,它会降低性能。
另请注意,不应过度使用捕获组。如果您不打算使用该组的内容,请使用非捕获组(String REGEX = ".*[ \t\r\n]+.*";
),或将其删除。