java - 正则表达式 [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个问题。
解决方案
我认为您误解了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 上创建了一个演示,它输出每个子字符串,因此您可以看到它的实际效果。
推荐阅读
- sql-server - 是否可以创建一个新模式而不是创建一个新的数据库实例?
- swift - 带有父模型和子模型的 RealmSwift @ObservedResults,不能在写事务之外修改托管 RLMArray
- python - 当行内容是相关键的键值(每列的标题)时,如何用python在csv中编写嵌套字典?
- hibernate - Micronaut,休眠,错误的查询生成
- java - 如何在 JPA Criteria Builder 中将 varchar 日期类型转换为日期格式?
- python - 错误:AttributeError:“NoneType”对象没有属性“write_audiofile”
- swift - 带有 `isActive=true` 的嵌套 NavigationLinks 未正确显示
- python - Pycozmo立方体被敲击了吗?
- php - 使用递归函数构建嵌套数组
- reactjs - NVDA 将徽标读取为不可点击