📜  珀尔 |使用正则表达式在文件中搜索

📅  最后修改于: 2022-05-13 01:55:13.612000             🧑  作者: Mango

珀尔 |使用正则表达式在文件中搜索

先决条件: Perl |常用表达

Perl 中的正则表达式(Regex 或 Regexp 或 RE)是一个特殊的文本字符串,用于描述给定文本中的搜索模式。 Perl 中的正则表达式与宿主语言相关联,与PHP、 Python等不同。有时这些被称为“Perl 5 兼容正则表达式”。要使用正则表达式,需要使用绑定运算符,例如=~ (正则表达式运算符)和!~ (否定正则表达式运算符)。
这些绑定正则表达式运算符用于匹配来自正则表达式的字符串。语句的左侧将包含一个字符串,该字符串将与包含指定模式的右侧匹配。否定的正则表达式运算符检查字符串是否不等于右侧指定的正则表达式。

正则表达式运算符有助于在文件中搜索特定单词或一组单词。这可以根据用户的要求以多种方式完成。在 Perl 中搜索遵循标准格式,首先以读取模式打开文件,然后逐行进一步读取文件,然后在每一行中查找所需的字符串或字符串组。当找到所需的匹配项时,搜索表达式后面的语句将确定下一步如何处理匹配的字符串,它可以添加到用户指定的任何其他文件中,也可以简单地打印在控制台上。

在为将所需字符串与文件匹配而创建的正则表达式中,可以有多种方法来搜索所需字符串:

常规搜索:

这是编写在指定文件中查找所需字符串的正则表达式的基本模式。以下是此类正则表达式的语法:

$String =~ /the/

此表达式将搜索文件中包含带有字母 ' the ' 的单词的行,并将该单词存储在变量$String中。此外,可以将此变量的值复制到文件中或简单地打印在控制台上。

例子:

use strict;
use warnings;
  
sub main
{
    my $file = 'C:\Users\GeeksForGeeks\GFG.txt';
    open(FH, $file) or die("File $file not found");
      
    while(my $String = )
    {
        if($String =~ /the/)
        {
            print "$String \n";
        }
    }
    close(FH);
}
main();

输出:

可以看出,上述搜索还导致选择了包含“the”的单词。为了避免这样的词,可以通过以下方式更改正则表达式:

$String =~ / the /

通过在要搜索的所需单词的前后提供空格,将搜索到的单词与两端隔离,并且在搜索过程中不会返回包含它作为其一部分的单词。这将解决搜索不需要的额外单词的问题。但是,这将导致在请求的搜索词之后立即排除包含逗号或句号的词。
为了避免这种情况,还有其他方法可以帮助将搜索限制为特定的单词,其中一种方法是使用单词边界。

在正则表达式搜索中使用词边界:

从上面的示例中可以看出,常规搜索会返回包含搜索词作为其一部分的额外词,或者如果在所需词之前和之后使用空格进行搜索,则会排除一些词。为了避免这种情况,使用了用' \b '表示的单词边界。

$String =~ /\bthe\b/;

这将限制包含所请求单词的单词作为其一部分进行搜索,并且不会排除以逗号或句号结尾的单词。

例子:

use strict;
use warnings;
  
sub main
{
    my $file = 'C:\Users\GeeksForGeeks\GFG.txt';
    open(FH, $file) or die("File $file not found");
      
    while(my $String = )
    {
        if($String =~ /\bthe\b/)
        {
            print "$String \n";
        }
    }
    close(FH);
}
main();

输出:

从上面给出的示例中可以看出,以句号结尾的词被包括在搜索中,但包含搜索词作为一部分的词被排除在外。因此,词边界可以帮助克服常规搜索方法中产生的问题。

如果需要查找以特定字符开头或结尾或两者都有的单词怎么办?那么这不能通过使用常规搜索或单词边界来完成。对于这些情况,Perl 允许在正则表达式中使用通配符。

在正则表达式中使用通配符:

Perl 允许使用正则表达式中的通配符在给定文件中搜索一组特定的单词或遵循特定模式的单词。通配符是放置在正则表达式中的“点”以及要搜索的所需单词。这些通配符允许正则表达式搜索遵循给定模式的所有相关单词并显示相同的单词。通配符有助于减少搜索具有共同字母模式的各种不同单词所涉及的迭代次数。

$String =~ /t..s/;

上面的模式将搜索所有以 t 开头、以 s 结尾并且它们之间有两个字母/字符的单词。

例子:

use strict;
use warnings;
  
sub main
{
    my $file = 'C:\Users\GeeksForGeeks\GFG.txt';
    open(FH, $file) or die("File $file not found");
      
    while(my $String = )
    {
        if($String =~ /t..s/)
        {
            print "$String \n";
        }
    }
    close(FH);
}
main();

输出:

上面的代码包含给定模式中指定的所有单词。

在这种打印搜索词的方法中,包含该词的整行都被打印出来,这使得很难准确地找出用户正在搜索的词。为了避免这种混淆,我们只能打印搜索到的单词而不是整个句子。这是通过使用括号对搜索的模式进行分组来完成的。为了打印这组单词,使用$number变量。
$number variables是在正则表达式中形成的捕获组的最后一次成功匹配的匹配项。例如,如果正则表达式中有多个分组,则$1将打印匹配第一个分组的单词,类似地, $2将匹配第二个分组,依此类推。

下面给出的是使用 $number 变量转换的上述程序以仅显示搜索到的单词而不是整个句子:

use strict;
use warnings;
  
sub main
{
    my $file = 'C:\Users\GeeksForGeeks\GFG.txt';
    open(FH, $file) or die("File $file not found");
      
    while(my $String = )
    {
        if($String =~ /(t..s)/)
        {
            print "$1 \n";
        }
    }
    close(FH);
}
main();

输出: