【问题标题】:how does the regex like ".*" work in perl像“。*”这样的正则表达式如何在 perl 中工作
【发布时间】:2013-10-25 07:05:41
【问题描述】:

我对@9​​87654321@这样的正则表达式感到困惑

#!usr/bin/perl
use strict;
use warnings;

my $text = "scott";
$text =~ s/.*/\//g;
print $text;

输出://

所以,我不知道为什么结果是// 而不是/

【问题讨论】:

  • . 匹配任何字符,* 匹配 0 或任何出现的前一个字符。所以.* 表示匹配任何东西
  • @bansi 那么为什么它不匹配所有内容
  • perl -MData::Dumper -e '$text="scott"; $text =~ s/(.*)/print Dumper $1/ge'
  • 我们可以看到正则表达式引擎在到达字符串末尾时会尝试再匹配一次,但我认为问题是为什么它已经到达字符串末尾时会继续运行.

标签: regex perl


【解决方案1】:

.* 匹配两次。首先,它匹配“scott”。然后它匹配 after "scott" 之后的空字符串。

【讨论】:

  • 确实如此。运行use re "debug"; 看看谁是正确的:)
  • 这个是。使用$text =~ s/(.*)/-> $1 <-/g; 轻松验证。
  • 嘿伙计们,我们不在投票战网站上。它不会帮助其他人希望找到解决方案。在投票时解释一下会很好。这将有助于发帖者理解他们的错误。我们都在这里学习。
  • 对不起。我仍然很困惑。如果我使用 $text =~ s/^.*/\//g;你知道,结果将是“/”(只有一个斜线)。我想知道为什么会这样。那么,如果匹配“scott”后的空字符串,该如何解释呢。
  • 请记住,正则表达式会继续查看原始字符串,同时将结果构建到新字符串中。 /^.*/ 不能在"scott" 的末尾再次匹配,因为^ 只允许它在字符串的开头匹配。
【解决方案2】:

第一次通过时,.* 匹配从位置零 (scott) 开始的 5 个字符。这将替换为 /

/g 表示尽可能多地匹配,所以它再次尝试,这次从位置 5 开始。

第二次,.* 匹配从位置 5 开始的 0 个字符(空字符串)。这将替换为/

第三次,.* 匹配从位置 5 ("") 开始的 0 个字符,但有一个检查可确保它连续两次不匹配相同的起始位置和长度。所以它推进位置并尝试在第六位置匹配。因为那在字符串之外,所以它失败了。

【讨论】:

  • 我同意你的看法。实际上,如果我删除 /g 选项,它将是 /(一个斜杠)。另外,s/.*?t/g => //和s/.*?t/ => /,所以我相信你。
  • 同一起始位置连续两次零长度不匹配;长度非零,不能有相同的起始位置
  • @ysth,同样的事情。我的措辞清楚地表明,否则会出现无限循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多