【问题标题】:Confused by Perl lookahead and lookbehind被 Perl 前瞻和后瞻弄糊涂了
【发布时间】:2014-04-16 01:35:39
【问题描述】:

我对 Perl 前瞻 (?=regex) 和后瞻 (?<=regex) 感到困惑,需要一些帮助来理解它。

前瞻是指look to the right of (?=regex)

lookbehind 的意思是look to the left of (?<=regex)

我还注意到lookbehind (?

例如,给出以下代码行,我想匹配数字,但前提是它不在注释行中。所以它应该匹配2,而不是1

 #Comment 1
 my $number = 2

我试过了

/(?<!^#)\d/ 
match a number if the line does not start with #

那没有用,是因为它不是一个固定宽度的lookbehind正则表达式吗?

谢谢

【问题讨论】:

  • 你要解析什么语言?
  • 我只是在自学一些 Perl 正则表达式,仅以该代码为例。
  • 我明白,但没有上下文和规则,你的问题没有任何意义。
  • 嗯,我相信我的问题非常具体和明确。
  • "mmmmmm" : "例如,给出以下代码行,"。什么样的代码?

标签: regex perl


【解决方案1】:

正确、前瞻和后向搜索从它们在正则表达式中的位置开始搜索。因此,您的示例 /(?&lt;!^#)\d/ 将匹配任何数字,只要它不是 立即 在字符串开头的 # 之后。

例如:

my $string = "123 #456 #789"
while ($string =~ /(?<!#)(\d+)/g) {
     print $1;
}

上面将打印1235689。只有 4 和 7 会被跳过,因为它们前面紧跟着 #

更新

谈谈你的具体正则表达式:

use strict;
use warnings;

my $string = "#123 #456 #789";
while ($string =~ /(?<!^#)(\d+)/g) {
     print $1;
}

上面将打印23456789,因为只有数字1前面有一个#,它位于字符串的开头。

【讨论】:

  • 我仍然认为 (?
  • 我想我明白了,^ 表示字符串的开头不是后向行的开头。
  • @AskandLearn:这一个固定长度的look-behind。什么让你困惑? ^ 的内部和外部行为相同。它匹配字符串的开头,如果 /m 修饰符有效,则匹配换行符之后的点
  • @Borodin 非常感谢重播,我只是认为^ 仍然匹配到线路的开头。只是想看看我是否可以使用lookbehind 排除所有 cmets 行。这行得通吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2019-01-12
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2014-08-14
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多