正则表达式:组匹配有何用处?

正则表达式:组匹配有何用处?

我决定学习一些正则表达式基础知识。我正在使用 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

有一个输入字段,您可以在其中输入模式以完成任务。经过多次尝试和失败,我终于想出了这个办法。

^(file_a_record_file)\.pdf$

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

现在,这对第一个文件有效,但对第二个文件无效。任务要求我创建一个模式,该模式将匹配并捕获两个文件的文件名(不包括扩展名)。所以这就是我接下来想到的。

^(file_.*)\.pdf$

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

能否更严谨地描述一下?网站上没有给出正确的解决方案。所以我没有东西可以检查我的答案。这很遗憾,因为我认为这是对正则表达式的一个很好的介绍。每节课给出的例子有时很难理解。

再说一遍,这有什么用呢?他提到了一些关于命令行的事情,我认为他的意思是它可以用来重复使用命令之类的东西……嗯,我不太明白他在说什么。

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

提取信息?他在说什么?有人能告诉我这有什么用吗?并给我举个真实的例子。

答案1

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

file_a_record_file.pdf
file_yesterday.pdf

并跳过

testfile_fake.pdf.tmp

最简单的正则表达式是

(.*)\.pdf$

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

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

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

这将打印“world Hello”,因为第一个括号被捕获 Hello并捕获了第二个world,但我们随后进行打印,$2 $1因此两个匹配项是颠倒的。

其他正则表达式实现允许您使用 等来引用捕获的模式\1\2例如,GNU sed

echo "Hello world" | sed 's/\(.*\) \(.*\)/\2 \1/'

因此,一般来说,当你以后需要引用这些模式时,捕获模式很有用。这被称为引用并将在您稍后进行的教程中进行简要解释。

答案2

较短的一个:

(.*)\.pdf$



为什么要捕获/分组:

当你通过将正则表达式添加到程序中,或者在程序中使用它,你需要店铺火柴,则使用分组。

以上面的正则表达式为例,程序会检查正则表达式是否匹配,如果匹配,你就可以简单地得到你想要的短语封闭式它与()

演示:

String stringToCheck = "example.pdf";           // Example string for testing
Pattern p = Pattern.compile("(.*)\.pdf$");      // Matching regex
Matcher m = r.matcher(stringToCheck);           // Java's own component to 'match' the string, proccessing is here
if (m.matches()) {                              // Check if the regex has matched
                                                // What? How to reterive the filename?
                                                // That's why we grouped our filename in the regex
    String filename = m.group(1);               // Reterive the first grouped part
    System.out.println(filename);               // Java's own way to print string, this is printing filename
}                                               // ??? PROFIT

相关内容