java - 正则表达式 [A-Za-z !,?. _'@]+ returns 0 matches while [ !,?._' @]+ 返回 10?

标签 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:正则表达式 [A-Za-z !,?._'@]+ 返回 0 个子字符串,而 [ !,?._'@]+返回 10。请解释从模式中删除 A-Za-z 如何导致匹配?

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

请解释以上2个问题。

最佳答案

我认为您误解了 split 的工作原理 - 它在字符串中查找与模式匹配的表达式,然后拆分它们周围的字符串,从而删除该过程中的模式。请参阅manual .

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

在第二个示例中,正则表达式 [ !,?._'@]+ 返回 10 个子字符串,因为该模式在字符串中出现 9 次:(space)(空格)(空格)(空格)(空格) (空格),(空格)'(空格)(最后一个 不会生成子字符串,因为它后面没有字符)。输出子字符串为:Heisaveryvery男孩isnt

最后,在第三个示例 ([ !,?._'@]) 中,不同之处在于 ,(space) 在第二个示例(由于正则表达式上的 +)现在匹配为两个:(space)。这会在输出中产生一个额外的空子字符串。输出子字符串为:Heisavery非常男孩(空)isn

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

关于java - 正则表达式 [A-Za-z !,?. _'@]+ returns 0 matches while [ !,?._' @]+ 返回 10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754719/

相关文章:

java - 使用 Hibernate 处理不同的用户类型

java - 以函数作为参数的 dll 的函数(Callback Java)

java - 谁能解释一下下面的命令吗?

regex - 正则表达式删除字符前的所有文本

javascript - 如何在 javascript 中使用 unicode 和 utf-8 解码字符串?

java - junit 未找到 Web 应用程序上下文 : no ContextLoad Listener registered?

java - 如何禁用 SWT 文本中的粘贴操作

javascript - 正则表达式中的负向后查找中的范围与字符

python - 正则表达式python压缩字符串

regex - 在 Notepad++ 中使用正则表达式每隔n次出现一个空格添加新行