Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“试图理解”;“捕获组”;在正则表达式中使用Java_Java_Regex_Capture - Fatal编程技术网

“试图理解”;“捕获组”;在正则表达式中使用Java

“试图理解”;“捕获组”;在正则表达式中使用Java,java,regex,capture,Java,Regex,Capture,我正在为JavaOCP学习,目前我正在努力理解这一部分。这是一种过于抽象的描述方式。你能(如果你有时间)给我一些使用“捕获组”的真实例子吗 有谁能为我提供以下陈述的具体例子吗 捕获组是将多个角色视为单个角色的一种方式 单位。它们是通过将要分组的字符放在其中创建的 一组括号。例如,正则表达式(dog) 创建包含字母“d”、“o”和“g”的单个组。这个 将显示与捕获组匹配的输入字符串部分 保存在内存中,以便以后通过反向引用调用(如前所述 在下面的部分,反向参考) 我非常确信,只要我看到一个具体的例子

我正在为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用作示例!