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:正则表达式 [A-Za-z !,?._'@]+
返回 0 个子字符串,而 [ !,?._'@]+
返回 10。请解释从模式中删除 A-Za-z
如何导致匹配?
问题 2:正则表达式 [ !,?._'@]+
返回 10 个子字符串,而 [ !,?._'@]
返回 11。使用 + 和不使用 + 会提供不同的答案,请解释。我知道 + 匹配一个或多个。当我输出分割数组时,我看到带 + 号的正则表达式将“,”(男孩后面的逗号和空格)视为一种模式。但如果没有 + 号,它会将“,”视为 2 个独立的模式。这是否意味着 + 符号用于匹配正则表达式模式的一个或多个组合?
请解释以上2个问题。
最佳答案
我认为您误解了 split
的工作原理 - 它在字符串中查找与模式匹配的表达式,然后拆分它们周围的字符串,从而删除该过程中的模式。请参阅manual .
在第一个示例中,正则表达式 [A-Za-z !,?._'@]+
匹配字符串中的每个字符,因此 split
不返回任何内容图案两边都没有字符。
在第二个示例中,正则表达式 [ !,?._'@]+
返回 10 个子字符串,因为该模式在字符串中出现 9 次:(space)
、(空格)
、(空格)
、(空格)
、(空格)
、 (空格)
、,(空格)
、'
和 (空格)
(最后一个 ?
不会生成子字符串,因为它后面没有字符)。输出子字符串为:He
、is
、a
、very
、very
、 好
、男孩
、isn
、t
、他
。
最后,在第三个示例 ([ !,?._'@]
) 中,不同之处在于 ,(space)
在第二个示例(由于正则表达式上的 +
)现在匹配为两个:、
和 (space)
。这会在输出中产生一个额外的空子字符串。输出子字符串为:He
、is
、a
、very
、非常
、好
、男孩
、(空)
、isn
、 他
,他
。
我创建了一个 demo on rextester它输出每个子字符串,以便您可以看到它的实际情况。
关于java - 正则表达式 [A-Za-z !,?. _'@]+ returns 0 matches while [ !,?._' @]+ 返回 10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754719/