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