Perl - 字母序列中的部分模式匹配

时间:2013-06-26 12:20:56

标签: perl pattern-matching partial

我正在尝试使用perl查找模式。但我只对模式的开始和结束感兴趣。更具体地说,我有一系列字母,我想看看是否存在以下模式。有23个字符。而且我只对序列的开始和结束感兴趣。

例如,我想提取以ab开头并以zt结尾的任何内容。永远都有 所以它可以是

abaaaaaaaaaaaaaaaaaaazt   

以便它检测到这个匹配 但不是

abaaaaaaaaaaaaaaaaaaazz   

到目前为止,我试过

if ($line =~ /ab[*]zt/) {
    print "found pattern ";
}

感谢

2 个答案:

答案 0 :(得分:3)

*是一个量词和元字符。在字符类括号[ .. ]内,它只是一个文字星号。您可能正在考虑.*这是一个通配符,后跟量词。

匹配整个字符串,例如"abaazt"

/^ab.*zt$/

请注意主播^$,以及通配符.,后跟零个或多个*量词。

匹配另一个字符串中的子字符串,例如"a b abaazt c d"

/\bab\S*zt\b/

使用单词边界\b表示开头和结尾而不是锚点。您还可以更具体:

/(?<!\S)ab\S*zt(?!\S)/

使用双重否定断言目标文本后面或之前没有非空白字符。

也可以使用substr功能

if (substr($string, 0, 2) eq "ab" and substr($string, -2) eq "zt") 

你提到字符串是23个字符,如果是固定长度,你可以更具体,例如

/^ab.{19}zt$/

其中恰好匹配19个通配符。 {}量词的语法为{min, max},任何留空的值均为无效,即{1,}+相同,{0,}*,分别表示一个/零个或多个匹配。

答案 1 :(得分:0)

只有*本身不匹配任何内容(文字*除外),如果您想匹配任何,您需要使用.*。< / p>

if ($line =~ /^ab.*zt$/) {
    print "found pattern ";
}

如果你真的想捕获匹配,请将整个模式包装在捕获组中:

if (my ($string) = $line =~ /^(ab.*zt)$/) {
    print "found pattern $string";
}