【发布时间】:2011-12-03 15:39:13
【问题描述】:
考虑以下正则表达式:
(([^\|])*\|)*([^\|]*)
这匹配类型的重复字符串模式
("whatever except |" |) {0 to any times} ("whatever except |" |) {1 time}
所以它应该匹配下面的字符串,它有17个子字符串(16个重复,加上“z”作为最后一个)。
"abcd | e | fg | hijk | lmnop | | | qrs | t| uv| w |||||x y| z"
确实,RegexPal 会验证给定的正则表达式是否与上述字符串匹配。
现在,我想获取每个子字符串(即“abcd |”、“e |”、“fg |”等),对于它们的数量、长度等没有先验知识。
根据类似标题的previous StackOverflow post 和Matcher 类find() 方法的文档,我只需要做类似的事情
Pattern pattern = Pattern.compile(regex); // regex is the above regex
Matcher matcher = pattern.matcher(input); // input is the above string
while (matcher.find())
{
System.out.println(matcher.group(1));
}
但是,当我这样做时,我只打印出 2 个字符串:最后一个重复的子字符串 ("x y|") 和一个空值;绝对不是我期望的 16 个子字符串。
在运行 find() 循环之前,检查是否确实发生了匹配也是一件好事,但我不确定是 matches()、groupCount() > 0 还是其他一些考虑到find() 也进行匹配,所以应该使用条件,而不做两次匹配工作。
所以,问题:
- 如何获取所有 16 个重复的子字符串?
- 如何获取最后一个子字符串?
- 如何检查字符串是否匹配?
【问题讨论】:
标签: java regex matching repeat