正则表达"匹配"与"捕捉"

asi*_*mes 8 regex

我一直在查找正则表达式教程试图了解它们并且正在享受此链接中的教程直到这个问题:http://regexone.com/lesson/12

我似乎无法弄清楚"匹配"和"捕获"之间的区别是什么.我写的任何内容似乎都没有选择"Capture"部分下的文本(甚至不是.*).

编辑:以下是教程让我感到困惑的例子:(.* (.*))被认为是正确的而(.* .*)不是.这是教程的问题还是我不​​理解的东西?

rev*_*evo 8

匹配:

当引擎匹配字符串或整体的一部分但确实没有返回任何内容.

捕获:

当引擎匹配字符串或整体的一部分并确实返回一些东西.

- 返回的意义是什么?

当你需要检查/存储/验证/工作/喜欢你的正则表达式匹配它的字符串的一部分之后你需要捕获组(...)

在您的示例中,此正则表达式.*?\d+与日期和年份匹配请参见此处

这个正则表达式.*?(\d+)匹配整体并捕获年份.请参阅此处

并且(.*?(\d+))将匹配整体并分别捕获整个和年份.请参见此处

*请注意标题为匹配组的右下方框

所以回来....

1:

preg_match("/.*?\d+/", "Jan 1987", $match);
print_r($match);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Jan 1987
)
Run Code Online (Sandbox Code Playgroud)

2:

preg_match("/(.*?\d+)/", "Jan 1987", $match);
print_r($match);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Jan 1987
    [1] => Jan 1987
)
Run Code Online (Sandbox Code Playgroud)

3:

preg_match("/(.*?(\d+))/", "Jan 1987", $match);
print_r($match);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Jan 1987
    [1] => Jan 1987
    [2] => 1987
)
Run Code Online (Sandbox Code Playgroud)

所以你可以在最后一个例子中看到,我们在索引2个捕获组12的阵中,而0永远是匹配的字符串但它没有捕获.


rad*_*dai 6

在正则表达式中捕获意味着表明您不仅对匹配感兴趣(即查找与正则表达式匹配的字符串),而且对稍后使用匹配字符串的特定部分也感兴趣。

例如,您链接到的教程的答案是(\w{3}\s+(\d+))

现在,为什么?

为了简单地匹配日期字符串,编写(3个单词字符,后跟一个或多个空格,后跟一个或多个数字)就足够了\w{3}\s+\d+,但将捕获组添加到表达式中(捕获组只是括在括号中的任何内容())将允许我稍后提取整个表达式(使用“$1”,因为最外面的一对括号是解析器遇到的第一个)或仅提取年份(使用“$2”,因为第二对括号,围绕\d+,是正则表达式解析器遇到的第二对)

当您不仅对将字符串与模式匹配,而且还对从匹配的字符串中提取数据或以任何方式修改它们感兴趣时,捕获组会派上用场。例如,假设您想为教程中的每个日期添加 5 年 - 能够从匹配的字符串中仅提取年份部分(使用$2)将会派上用场