Java Regex组0
有人可以帮我解释下面的代码吗? 谢谢。 我对正则表达式分组有点困惑。
public static String evaluate(String s) { if (s == null) return ""; Matcher m = Pattern.compile("[0-9]*").matcher(s); if (m.find()) { MatchResult mr = m.toMatchResult(); return mr.group(0); } return ""; }
从文档 :
组零表示整个模式 ,因此表达式
m.group(0)
等效于m.group()
。
换句话说, mr.group(0)
是整个匹配。
希望这使得组0更加清晰:
例:
String str = "start123456end"; // Your input String // Group#1 Group#2 // | | Pattern p = Pattern.compile("start([0-9]*)(end)"); // |<--- Group#0 --->| Matcher m = p.matcher(str); // Create a matcher for regex and input while( m.find() ) // As long as your regex matches something { System.out.println("group#0:\t" + m.group()); // Or: m.group(0) System.out.println("group#1:\t" + m.group(1)); System.out.println("group#2:\t" + m.group(2)); }
输出:
group#0: start123456end group#1: 123456 group#2: end
您可以将正则表达式的某些部分“存储”为组。 在我的例子中,你有3个(组在(
和)
之间):
- 第1组: 开始和结束字之间的数字。
- 第2组:仅限结束词
- 第0组:这就是与你的模式相匹配的全部内容 – 组0是保留的,并且将始终返回整个匹配,而所有其他都是可选的并由您定义。
根据你的代码:
例:
Matcher m = Pattern.compile("[0-9]*").matcher("123456end"); // Matches all numbers if( m.find() ) { System.out.println(m.group(0)); // m.group() possible too }
只有一组: 0
!
输出: 123456
(=组0)
现在让我们在模式中添加更多组:
码:
// Group#1 Group#2 // | | Matcher m = Pattern.compile("([0-9])[0-9]([0-9])*").matcher(str); // Matches all numbers // |<---- Group#0 ---->| if( m.find() ) { System.out.println("group#0:\t" + m.group(0)); // m.group() possible too System.out.println("group#1:\t" + m.group(1)); // 1st digit System.out.println("group#2:\t" + m.group(2)); // 3rd digit }
现在还有两个小组。
输出:
group#0: 123456 group#1: 1 group#2: 6
我建议你这个文档: 课程:正则表达式 。 真的从第一章开始,自己尝试一些例子。
额外:
- Java Regex教程 (参见3.4。用于分组的分组和反向引用 )
- Java中正则表达式指南(第1部分)
- Java中正则表达式指南(第2部分)