正则表达式:组匹配有什么用?

Sam*_*mir 6 regex

我决定学习一些正则表达式的基础知识。我在网上使用 Regex One 课程,我在第 11课上被困了一段时间,但我想我现在明白了。

这就是任务。

“编写一个仅匹配以下 PDF 文件的文件名(不包括扩展名)的正则表达式。”

task            text                     capture
capture text    file_a_record_file.pdf   file_a_record_file
capture text    file_yesterday.pdf       file_yesterday
skip text       testfile_fake.pdf.tmp
Run Code Online (Sandbox Code Playgroud)

有一个输入字段,您可以在其中输入模式以完成任务。经过一些试验和错误,这就是我想出的。

^(file_a_record_file)\.pdf$
Run Code Online (Sandbox Code Playgroud)

这将匹配文件名file_a_record_file.pdf但只“捕获” file_a_record_file。有什么区别?...匹配和“捕获”之间有什么区别?这有什么用?这个“组匹配”如何?

现在这对第一个文件有效,但对第二个文件无效。该任务说我需要制作一个模式来匹配并捕获两个文件的文件名,不包括扩展名。所以这就是我接下来提出的。

^(file_.*)\.pdf$
Run Code Online (Sandbox Code Playgroud)

由于两个文件名都以file_开头,我认为最好匹配它,然后告诉它匹配后面的任何字符,然后用括号退出组(“组”是括号内的内容,对?) 并用反斜杠转义点并以文件扩展名结尾。

这可以用更严格的方式描述吗?网站上没有给出正确的解决方案。所以我没有什么可以检查我的答案。很遗憾,因为我认为这是对正则表达式的很好的介绍。每节课给出的例子有时很难理解。

再说一次,这有什么用?他提到了一些关于命令行的东西,我认为他的意思是它可以用来重用命令或其他东西......好吧,我真的不明白他在说什么。

想象一下,我们有一个命令行工具,它仅在某个目录中的每个文件不存在时才将其复制到服务器,并打印每个文件名作为结果。现在,如果我想对每个文件名执行另一项任务,那么我不仅需要一个匹配文件名的正则表达式,还需要某种方法来提取该信息。

提取信息?他在说什么?有人可以告诉我这有什么用,并给我一个真实世界的例子吗?

ter*_*don 8

在您链接到的课程中,您需要编写一个正则表达式来捕获这两个文件名

file_a_record_file.pdf
file_yesterday.pdf
Run Code Online (Sandbox Code Playgroud)

并跳过

testfile_fake.pdf.tmp
Run Code Online (Sandbox Code Playgroud)

最简单的正则表达式是

(.*)\.pdf$
Run Code Online (Sandbox Code Playgroud)

这意味着匹配以 结尾的所有内容.pdf但仅捕获文件名。

那么,为什么捕获有用呢?这取决于您使用这些正则表达式的程序。捕获模式允许您将捕获的内容保存为变量。例如,使用 Perl,第一个捕获的模式是$1,第二个$2等等:

echo "Hello world" | perl -ne '/(.+) (.+)/; print "$2 $1\n"'
Run Code Online (Sandbox Code Playgroud)

这将打印“world Hello”,因为第一个括号被捕获 Hello,第二个括号捕获,world但我们正在打印,$2 $1因此两个匹配项被反转。

其他正则表达式实现允许您指的是使用摄像图案\1\2等等。例如,GNU sed

echo "Hello world" | sed 's/\(.*\) \(.*\)/\2 \1/'
Run Code Online (Sandbox Code Playgroud)

因此,一般来说,当您稍后需要参考这些模式时,捕获模式很有用。这称为引用,稍后将在您正在做的教程中简要说明。

  • @Sammy 是的,你是对的。您也可以稍后在另一个正则表达式中使用捕获的引用,或者实际上任何类型的操作:复制到另一个变量,打印它,对其进行更多处理,用作另一个程序的参数等。 (2认同)