regex - 如何让正则表达式从字符串的开头开始

标签 regex perl

这是我遇到的一个奇怪的问题(可能以前见过但从未注意过)。

这是代码的要点:

my $url = 'http://twitter.com/' . $handle;
my $page = get($url);

if($page =~ m/Web<\/span>\s*<a href=\"(.+?)\"/gi) {
    $website = $1;
}

if($page =~ m/follower_count\" class=\"stats_count numeric\">(.+?)\s*</g) {
    $num_followers = $1;
}

它获取一个 twitter url 并执行一些正则表达式来捕获关注者的数量和用户的网站。这段代码实际上工作正常。但是,当您在搜索关注者之后切换顺序并搜索网站时,网站显示为空。事实证明,当你正则表达式一个字符串时,它似乎保存了最后一次匹配的位置。在 html 中,关注者计数在网站显示后出现。如果您首先执行关注者计数正则表达式,就像它启动了关注者计数停止的网站正则表达式(如对字符串的索引引用)。

让我感到困惑的是,我在末尾有“g”运算符,表示“全局”,如“全局搜索字符串......从头开始”。

我在这里错过了什么吗?我似乎无法弄清楚为什么它会恢复字符串上的最后一个正则表达式位置(如果有道理的话)。

最佳答案

/g在标量上下文中,修饰符不会做您认为它会做的事情。摆脱它。

perlretut解释说,/g在标量上下文中依次循环每个匹配项。它设计用于循环,如下所示:

while ($str =~ /pattern/g) {
    # match on each occurence of 'pattern' in $str in turn
}

另一种使用方式 /g在列表上下文中:
my @results = $str =~ /pattern/g; # collect each occurence of 'pattern' within $str into @results

如果您使用的是 /g在标量上下文中并且您没有迭代它,您几乎肯定没有正确使用它。

关于regex - 如何让正则表达式从字符串的开头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587539/

相关文章:

perl - 如何有条件地在 Perl 中导入包?

regex - 如何检测perl字符串中的某些特殊字符?

perl - 使用 perl WWW::Mechanize 处理 404 和内部服务器错误

xml - 将 ref 传递给 XML::XPath 对象到 Perl 中的 sub 不能按预期工作

php - 检查 String 在 PHP 中是否只有用逗号分隔的整数

regex - 使用 grep 访问文件中的单词

java - 正则表达式不起作用

perl - 在 SSH 终端中执行的命令显示额外的行内容

python - 从字符串增加/减少 Python 中的 Mac 地址

python - 如何在python中仅替换正则表达式中的第一个单词