我正在尝试使用perl查找模式。但我只对模式的开始和结束感兴趣。更具体地说,我有一系列字母,我想看看是否存在以下模式。有23个字符。而且我只对序列的开始和结束感兴趣。
例如,我想提取以ab开头并以zt结尾的任何内容。永远都有 所以它可以是
abaaaaaaaaaaaaaaaaaaazt
以便它检测到这个匹配 但不是
abaaaaaaaaaaaaaaaaaaazz
到目前为止,我试过
if ($line =~ /ab[*]zt/) {
print "found pattern ";
}
感谢
答案 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";
}