0

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

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

abaaaaaaaaaaaaaaaaaaazt   

以便它检测到此匹配但不检测

abaaaaaaaaaaaaaaaaaaazz   

到目前为止我试过

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

谢谢

4

2 回答 2

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,}相同*,分别表示一个/零个或多个匹配项。

于 2013-06-26T12:42:58.280 回答
0

如果你想匹配任何你需要使用的东西,只是 a*本身不会匹配任何东西(除了文字) 。*.*

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

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

if (my ($string) = $line =~ /^(ab.*zt)$/) {
    print "found pattern $string";
}
于 2013-06-26T12:43:25.237 回答