“试图理解”;“捕获组”;在正则表达式中使用Java
我正在为JavaOCP学习,目前我正在努力理解这一部分。这是一种过于抽象的描述方式。你能(如果你有时间)给我一些使用“捕获组”的真实例子吗 有谁能为我提供以下陈述的具体例子吗 捕获组是将多个角色视为单个角色的一种方式 单位。它们是通过将要分组的字符放在其中创建的 一组括号。例如,正则表达式(dog) 创建包含字母“d”、“o”和“g”的单个组。这个 将显示与捕获组匹配的输入字符串部分 保存在内存中,以便以后通过反向引用调用(如前所述 在下面的部分,反向参考) 我非常确信,只要我看到一个具体的例子,我就会得到它“试图理解”;“捕获组”;在正则表达式中使用Java,java,regex,capture,Java,Regex,Capture,我正在为JavaOCP学习,目前我正在努力理解这一部分。这是一种过于抽象的描述方式。你能(如果你有时间)给我一些使用“捕获组”的真实例子吗 有谁能为我提供以下陈述的具体例子吗 捕获组是将多个角色视为单个角色的一种方式 单位。它们是通过将要分组的字符放在其中创建的 一组括号。例如,正则表达式(dog) 创建包含字母“d”、“o”和“g”的单个组。这个 将显示与捕获组匹配的输入字符串部分 保存在内存中,以便以后通过反向引用调用(如前所述 在下面的部分,反向参考) 我非常确信,只要我看到一个具体的例子
提前感谢。正因为如此,您才想了解比赛的各个部分。例如,如果您有正则表达式
cat (dog )?bus
/^(http | ftp)。*/
如果您获得了一个匹配项,您可以查询组的匹配项,并判断它是http还是ftp。除此之外,regex允许您获取由正则表达式的各个部分匹配的输入部分。有时你需要整个比赛,但通常你只需要其中的一部分。例如,此正则表达式匹配
“第X页,共Y页”
字符串:
Page \d+ of \d+
如果你传一串
Page 14 of 203
您将匹配整个字符串。现在假设您只需要14
和203
。没问题-正则表达式库允许您将两个\d+
括在括号中,然后从匹配中仅检索“14”
和“203”
字符串
Page (\d+) of (\d+)
上面的表达式创建两个捕获组。通过匹配模式获得的Matcher
对象允许您单独检索这些组的内容:
Pattern p = Pattern.compile("Page (\\d+) of (\\d+)");
String text = "Page 14 of 203";
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
这将打印14
和203
.以正则表达式为例
cat (dog )?bus
这将匹配字符串cat dog bus
和cat bus
。这是因为整个狗部分是可选的,因为?
。如果没有将其包装在paren中,则只有最后一个空格是可选的
James while John (had )+a better effect on the teacher
将匹配字符串
James while John had had had had had had had had had had had a better effect on the teacher
因为它将匹配整个had
字符串中的一个或多个
您还可以对捕获组使用交替引用和反向引用(您还没有完全了解这一点)
\1
是对第一个捕获组中捕获的内容的引用。这将匹配狗是狗
和猫是猫
,但不匹配狗是猫
,反之亦然。您可以看到一些易于理解的代码示例
基本上你在比赛后记得的()
中的内容。您可以看到与该组匹配的字符串。请记住,如果进行第二次匹配,这些值将被第二次匹配替换,因此如果需要,需要在匹配后立即将其保存在您定义的某个变量中。捕获组允许查询匹配器,以找出字符串中与正则表达式特定部分匹配的部分,请参见此示例:
String dateStr = "1981-06-25";
Pattern datePatt = Pattern.compile("([0-9]{4})/([0-9]{2})/([0-9]{2})");
...
Matcher m = datePatt.matcher(dateStr);
if (m.matches()) {
int year = Integer.parseInt(m.group(1));
int month = Integer.parseInt(m.group(2));
int day = Integer.parseInt(m.group(3));
}
变量year、month和day分别包含组1、2和3的值。很好的例子,除了你在某处混淆了天和月之外(我还想说,让天和月从0变为99是一种不好的做法)。谢谢你,Pescis,混合现在是固定的。这不是处理日期的最佳实践,但这是一个理解捕获组的简单示例。+1用作示例!