📜  Perl – 在正则表达式中使用捕获

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

Perl – 在正则表达式中使用捕获

正则表达式或正则表达式是字符我们正在查看的模式的字符串。它是一个特殊的字符串,描述了给定文本中存在的搜索模式。
Perl 允许我们将这些模式的一部分组合成一个子模式,并且还可以记住与这些子模式匹配的字符串。这种行为称为Capturing

在字符串中找到匹配项很重要,这是通过正则表达式 (regex) 完成的。当我们将它们从字符串中取出以进行进一步处理时,这些匹配项会更有用。

Perl 使我们可以很容易地通过在任何正则表达式中的数据周围使用括号 () 来提取匹配的字符串部分。 Perl 将这些匹配假设为每组捕获括号的特殊变量,即 $1、$2、$3。

例子:

use warnings;
use strict;
  
# Using the localtime() function
# to get the local time
my $time = localtime(); 
  
print $time, "\n";
  
# Using regex to capture time data
# Accessing the captured match 
# using the special variable $1
print ("$1 \n") if($time =~ /(\d\d:\d\d:\d\d)/);

命名捕获

允许我们通过应用正则表达式来捕获匹配部分并能够在以后使用它们的捕获称为命名捕获。例如:从联系信息中提取电话号码。

编号捕获的基本语法是:

(? …)

括号用于包围捕获。 ? 结构用于紧跟左括号并为该特定捕获提供名称。剩下的捕获是一个正则表达式。

当与封闭模式匹配成功时,Perl 更新神奇变量' %+ '。此散列包含捕获的名称作为键和与捕获匹配的字符串部分作为散列的值。
命名捕获通常会提高正则表达式的可维护性。尽管它们在 Perl 中是可能的,但它们并不经常使用。它们仅用于顶级正则表达式。

例子:

# Extracting the parts of string
$_ = "The brown fox jumps over the lazy dog";
/the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
  
# Printing the matches
print "color = $color, animal = $animal\n"; 
输出:
color = brown, animal = fox

编号捕获

编号的捕获既不提供任何识别名称,也不对 %+ 做任何事情。而在 Perl 中,捕获的字符串存储在一系列神奇的变量中。第一个匹配捕获存储在 $1 中,第二个存储在 $2 中,依此类推。捕获计数从捕获的左括号开始。因此,将第一个左括号捕获为 $1,第二个左括号捕获为 $2,依此类推。

命名捕获的语法比编号捕获的语法更长,并且还提供了额外的清晰度。编号捕获的正则表达式可维护性较低。编号的捕获在简单的替换中很有用,其中命名的捕获不必要地占用更多的代码。

例子:

# Extracting forename and surname
print "Please enter your name \n "; 
chop ($name = <'Vishal Raina '>);
  
if ($name =~ /^\s*(\S+)\s+(\S+)\s*$/) 
{
    print "Hi $1. Your Surname is $2.";
} 
else 
{
    print " Error";
}
print "\n";
输出
Please enter your name 
Hi Vishal. Your Surname is Raina.