【问题标题】:Perl - partial pattern matching in a sequence of lettersPerl - 字母序列中的部分模式匹配
【发布时间】:2013-06-26 12:20:56
【问题描述】:

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

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

abaaaaaaaaaaaaaaaaaaazt   

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

abaaaaaaaaaaaaaaaaaaazz   

到目前为止我尝试过

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

谢谢

【问题讨论】:

  • 是的,该代码应该可以工作。你有什么问题?
  • @TLP 谢谢。我发现了我正在做的错误并更新了问题。
  • 在使用 Perl 正则表达式时遇到问题,阅读 Perl 正则表达式教程 (perldoc.perl.org/perlretut.html) 和参考 (perldoc.perl.org/perlre.html) 可能会很有用。 Perl 文档确实非常好。为什么不试一试呢?
  • 谢谢@DaveCross。我会看看的。

标签: perl pattern-matching partial


【解决方案1】:

* 是一个量词和元字符。在字符类括号[ .. ] 中,它仅表示字面星号。您可能会想到.*,它是一个后跟量词的通配符。

匹配整个字符串,例如"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,}* 相同,表示一个/零或多个匹配(分别)。

【讨论】:

  • 我无法完成这项工作。我做了很长的路并使用了 /aa[A-Z][A-Z]...[A-Z]zt/ 。这个正在工作。我也想知道/打印它匹配的序列。有可能吗?
  • @user1007742: 1) 你为什么用那种方式? 2) [A-Z] 是大写字符。
  • 我的意思是 [a-z]。我知道这不是最好的方法。更准确地说,我有很长的字母序列,我想捕获所有匹配项并将它们全部打印出来。
  • @user 定义“这个”? [a-z]{19} 应该可以正常工作,除非您的字符串与您想象的不同。
【解决方案2】:

* 本身不会匹配任何东西(文字 * 除外),如果你想匹配 任何东西,你需要使用 .*

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

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

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

【讨论】:

  • 我想捕捉比赛。但这似乎不起作用。它没有输出任何东西。更准确地说,我有很长的字母序列,我想捕获所有匹配项并将它们全部打印出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多