首页 > 解决方案 > 正则表达式 [A-Za-z !,?._'@]+ 返回 0 个匹配项,而 [ !,?._'@]+ 返回 10 个?

问题描述

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个。使用+和不使用+给出不同的答案,请解释。我知道 + 匹配一个或多个。当我 sysout 拆分数组时,我看到带有 + 号的 RegEx 将“,”(男孩后面的逗号和空格)视为一种模式。但如果没有 + 符号,它会将“,”视为 2 个单独的模式。这是否意味着 + 符号用于匹配正则表达式模式的一个或多个组合?

请解释以上2个问题。

标签: javaregex

解决方案


我认为您误解了split它的工作原理 - 它在字符串中查找与模式匹配的表达式并在它们周围拆分字符串,在此过程中删除模式。请参阅手册

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

在第二个示例中,正则表达式[ !,?._'@]+返回 10 个子字符串,因为字符串中出现了 9 次模式:(space), (space), (space), (space), (space), (space), ,(space), 'and (space)(最后一个?不生成子字符串,因为它后面没有字符)。输出子串是:He, is, a, very, very, good, boy, isn, t, he.

最后,在您的第三个示例 ( [ !,?._'@]) 中,不同之处在于,(space)在第二个示例中匹配为一个分隔符(因为+正则表达式上的 )现在匹配为两个:,(space)。这会在输出中产生一个额外的空子字符串。输出子字符串是:He, is, a, very, very, good, boy, (empty), isn, t, he

在 rextester 上创建了一个演示,它输出每个子字符串,因此您可以看到它的实际效果。


推荐阅读