RegEx [A-Za-z!,?._'@] +返回0个匹配项,而[!,?.__ @@] +返回10个匹配项。

时间:2018-12-13 03:42:16

标签: java regex

String s = "He is a very very good boy, isn't he?";
Pattern pattern = Pattern.compile(("[A-Za-z !,?._'@]+"));
String[] split = pattern.split(s); 
System.out.println(split.length);

问题1:RegEx [A-Za-z !,?._'@]+返回0个子字符串,而[ !,?._'@]+返回10个子字符串。请说明如何从模式中删除A-Za-z导致匹配?

问题2:RegEx [ !,?._'@]+返回10个子字符串,而[ !,?._'@]返回11。使用+和不使用+提供不同的答案,请解释。我知道+匹配一个或多个。当我对拆分数组进行系统处理时,我看到带有正号的RegEx将“,”(男孩后的逗号和空格)视为一种模式。但是如果没有+号,它将“,”视为2个独立的模式。这是否意味着+符号用于匹配一个或多个正则表达式模式的组合?

请解释以上两个问题。

1 个答案:

答案 0 :(得分:2)

我认为您误会了split的工作原理-它在字符串中查找与模式匹配的表达式,然后将字符串拆分为字符串,从而在过程中删除了模式。参见manual

在您的第一个示例中,正则表达式[A-Za-z !,?._'@]+与字符串中的每个字符匹配,因此split不返回任何内容,因为该模式的两边都没有字符。

在第二个示例中,正则表达式[ !,?._'@]+返回10个子字符串,因为字符串中出现9个模式:(space)(space)(space),{{ 1}},(space)(space)(space),(space)'(最后一个(space)不会生成子字符串,因为后面没有字符)。输出子字符串为:?Heisaveryverygood,{{1 }},boyisn

最后在您的第三个示例(t)中,不同之处在于,在第二个示例中(由于正则表达式上的he),被匹配为一个定界符的[ !,?._'@]是现在匹配为两个:,(space)+。这将在输出中导致一个额外的空子字符串。输出子字符串为:,(space)Heisa,{{1 }},veryverygoodboy(empty)

我创建了一个demo on rextester,它输出每个子字符串,以便您可以实际看到它。