【问题标题】:Difference between Parentheses for Capturing and Back References in PerlPerl 中用于捕获和反向引用的括号之间的区别
【发布时间】:2016-02-06 06:13:37
【问题描述】:

我刚刚开始学习 Perl,我想知道在 Perl 中用于捕获和反向引用的括号之间的区别,以及每个括号更有用​​的情况?

当我说用于捕获的括号时,我指的是以下内容:

if ($email =~ /([^@]+)@(.+)/) {
    print "Username is $1\n";
    print "Hostname is $2\n";
}

当我说反向引用时,我指的是以下内容:

# (.)\1
# (.) = capture group; \1 = reference group
# (.)(.)\2\1; This pattern has 2 capture groups
# (.)(.)\g{2}\g{1}; This pattern is safer. Can't be confused w/ digits

如果我的语法与反向引用不正确,请告诉我,因为我不能 100% 确定反向引用的语法是如何工作的。

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果整个模式匹配,括号中的正则表达式模式的一部分将被捕获。如何使用捕获的子字符串无关紧要。捕获从左到右按照左括号出现在正则表达式模式中的顺序从 1 开始编号

    • 稍后可以通过使用\1 等序列或(最好)\g1 等序列在同一模式内用作反向引用

    • 它可以在模式外部作为简单的字符串值$1 等在替换的替换部分或后续的 Perl 代码中使用

    例如,您可以同时以两种方式使用捕获的字符串

    say $1 if $str =~ /(.)\g1/;
    

    请注意,如果模式匹配失败,$1 的值将与最近一次成功匹配不变,因此任何$1 等的使用都应以成功为条件要从中绘制的模式的匹配

    【讨论】:

      【解决方案2】:

      没有区别。括号捕获(除非它是 (?...) 构造之一)。您可以将捕获的文本用作反向引用或与捕获变量 ($1)(或两者)一起使用。

      【讨论】:

      • 那么两者的区别是我们用来调用括号内的文本的语法吗?
      【解决方案3】:

      没有区别。甚至没有两件事可以两个比较。只有(...)

      它可以用于反向引用。 \1 是一个正则表达式原子,它匹配第一次捕获的内容。这只能在正则表达式模式中使用。

      它可以用来捕捉。 $1 是一个 Perl 变量,其中包含第一次捕获的内容。这只能在 Perl 代码中使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2012-05-05
        • 2010-12-19
        • 1970-01-01
        • 2018-08-29
        • 2010-10-22
        相关资源
        最近更新 更多