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个独立的模式。这是否意味着+符号用于匹配一个或多个正则表达式模式的组合?
请解释以上两个问题。
答案 0 :(得分:2)
我认为您误会了split
的工作原理-它在字符串中查找与模式匹配的表达式,然后将字符串拆分为字符串,从而在过程中删除了模式。参见manual。
在您的第一个示例中,正则表达式[A-Za-z !,?._'@]+
与字符串中的每个字符匹配,因此split
不返回任何内容,因为该模式的两边都没有字符。
在第二个示例中,正则表达式[ !,?._'@]+
返回10个子字符串,因为字符串中出现9个模式:(space)
,(space)
,(space)
,{{ 1}},(space)
,(space)
,(space)
,,(space)
和'
(最后一个(space)
不会生成子字符串,因为后面没有字符)。输出子字符串为:?
,He
,is
,a
,very
,very
,good
,{{1 }},boy
,isn
。
最后在您的第三个示例(t
)中,不同之处在于,在第二个示例中(由于正则表达式上的he
),被匹配为一个定界符的[ !,?._'@]
是现在匹配为两个:,(space)
和+
。这将在输出中导致一个额外的空子字符串。输出子字符串为:,
,(space)
,He
,is
,a
,{{1 }},very
,very
,good
,boy
,(empty)
。
我创建了一个demo on rextester,它输出每个子字符串,以便您可以实际看到它。