Regex Perl正则表达式行与点匹配

Regex Perl正则表达式行与点匹配,regex,perl,Regex,Perl,我需要在一个长文本中搜索,这些行包含像“候选者编号:23”这样的文本 这条线的末尾必须有一个点。我试过了 $pat = 'candidate no:??' if ($line =~ /$pat/) { print "match found \n"; } 这很好,但当我尝试在图案中包含点时就不行了 $pat = 'candidate no:??.' 或 也试过 if ($line =~ /${pat}\.$/) 以上工作都没有,任何人都无法提出解决办法。该模式必须匹配字符串“候选编号:(

我需要在一个长文本中搜索,这些行包含像“候选者编号:23”这样的文本

这条线的末尾必须有一个点。我试过了

$pat = 'candidate no:??'

if ($line =~ /$pat/) {
print "match found \n";
}
这很好,但当我尝试在图案中包含点时就不行了

$pat = 'candidate no:??.'

也试过

if ($line =~ /${pat}\.$/) 
以上工作都没有,任何人都无法提出解决办法。该模式必须匹配字符串“候选编号:(某个数字)”,并带有一个点,然后是行尾

非常感谢

该模式必须匹配字符串“候选编号:(某个数字)”,并带有一个点,然后是行尾

我认为这个问题来自你的正则表达式中的双重问号
??
是一个惰性regexp量词,它表示前面元素的0或1次出现(此处分号为“
”:”
)。鉴于上述规范,这实际上没有意义

您的regexp缺少(整数)数字的表示形式。为此,您可以使用
'\d+
':

$pat = 'candidate no:\d+\.'

在zdim发表评论后更新

这里有一个替代解决方案,可以选择接受数字周围的空格,并显式定义数字后面的字符串结尾(可选空格和)

$pat = 'candidate no:\s*\d+\s*\.\s*$'
该模式必须匹配字符串“候选编号:(某个数字)”,并带有一个点,然后是行尾

我认为这个问题来自你的正则表达式中的双重问号
??
是一个惰性regexp量词,它表示前面元素的0或1次出现(此处分号为“
”:”
)。鉴于上述规范,这实际上没有意义

您的regexp缺少(整数)数字的表示形式。为此,您可以使用
'\d+
':

$pat = 'candidate no:\d+\.'

在zdim发表评论后更新

这里有一个替代解决方案,可以选择接受数字周围的空格,并显式定义数字后面的字符串结尾(可选空格和)

$pat = 'candidate no:\s*\d+\s*\.\s*$'

您需要阅读一些正则表达式,以便更好地理解模式

use strict;
use warnings;

my $match = qr/candidate no:\d+\./;

while( <DATA> ) {
    print if /$match/;
}

__DATA__
candidate no:2
candidate no:12
candidate no:43.
candidate no:254
candidate no:122.
candidate no:9.
candidate no:564
candidate no:367.
candidate no:98.
candidate no:25
candidate no:79
使用严格;
使用警告;
my$match=qr/候选人编号:\d+\./;
而(){
如果/$match/,则打印;
}
__资料__
候选人编号:2
候选人编号:12
候选人编号:43。
候选人编号:254
候选人编号:122。
候选人编号:9。
候选人编号:564
候选人编号:367。
候选人编号:98。
候选人编号:25
候选人编号:79

您需要阅读一些正则表达式,以便更好地理解模式

use strict;
use warnings;

my $match = qr/candidate no:\d+\./;

while( <DATA> ) {
    print if /$match/;
}

__DATA__
candidate no:2
candidate no:12
candidate no:43.
candidate no:254
candidate no:122.
candidate no:9.
candidate no:564
candidate no:367.
candidate no:98.
candidate no:25
candidate no:79
使用严格;
使用警告;
my$match=qr/候选人编号:\d+\./;
而(){
如果/$match/,则打印;
}
__资料__
候选人编号:2
候选人编号:12
候选人编号:43。
候选人编号:254
候选人编号:122。
候选人编号:9。
候选人编号:564
候选人编号:367。
候选人编号:98。
候选人编号:25
候选人编号:79

作为替代方案,代码可以更改为

use strict;
use warnings;

my $search = qr/candidate no:\d+\./;

map { print if /$search/ } <DATA>;

__DATA__
candidate no:2
candidate no:12
candidate no:43.
candidate no:254
candidate no:122.
candidate no:9.
candidate no:564
candidate no:367.
candidate no:98.
candidate no:25
candidate no:79
使用严格;
使用警告;
my$search=qr/候选人编号:\d+\./;
映射{print if/$search/};
__资料__
候选人编号:2
候选人编号:12
候选人编号:43。
候选人编号:254
候选人编号:122。
候选人编号:9。
候选人编号:564
候选人编号:367。
候选人编号:98。
候选人编号:25
候选人编号:79

作为替代方案,代码可以更改为

use strict;
use warnings;

my $search = qr/candidate no:\d+\./;

map { print if /$search/ } <DATA>;

__DATA__
candidate no:2
candidate no:12
candidate no:43.
candidate no:254
candidate no:122.
candidate no:9.
candidate no:564
candidate no:367.
candidate no:98.
candidate no:25
candidate no:79
使用严格;
使用警告;
my$search=qr/候选人编号:\d+\./;
映射{print if/$search/};
__资料__
候选人编号:2
候选人编号:12
候选人编号:43。
候选人编号:254
候选人编号:122。
候选人编号:9。
候选人编号:564
候选人编号:367。
候选人编号:98。
候选人编号:25
候选人编号:79

:??
匹配
零次或一次,但尽可能少<代码>匹配任何字符(不仅仅是点)<代码>:?\.与
:.
字面匹配。您从未为数字指定匹配项,或者在
之后和
之前指定任何匹配项。“匹配字符串”候选项否:(某个数字)。“带有点,然后是行尾。”--因此,您已经很好地阐述了正则表达式模式的描述,接下来要做的是找出如何进行匹配。现在您已经找到了一个解决方案,但我仍然建议您在阅读教程时,参考您身边的
:?
匹配
零次或一次,但尽可能少<代码>匹配任何字符(不仅仅是点)<代码>:?\.与
:.
字面匹配。您从未为数字指定匹配项,或者在
之后和
之前指定任何匹配项。“匹配字符串”候选项否:(某个数字)。“带有点,然后是行尾。”--因此,您已经很好地阐述了正则表达式模式的描述,接下来要做的是找出如何进行匹配。现在你已经有了一个解决方案,但我仍然建议你把教程和你身边的参考一起看一遍。讽刺的是,与点匹配正是OP需要做的
是用来匹配任何字符的,因此OP需要
候选编号:…\
。不过,您的版本是改进的。具有讽刺意味的是,与dot匹配正是OP需要做的
是用来匹配任何字符的,因此OP需要
候选编号:…\
。不过,您的版本是改进的。