Perl正则表达式 - gc修饰符的含义是什么?

时间:2012-07-09 12:51:50

标签: regex perl modifier

我有一个正则表达式,它匹配一些文本:

$text =~ m/$regex/gcxs

现在我想知道'gc'修饰符的含义:

我搜索过并发现 gc 表示“允许在失败/ g匹配后继续搜索”

我不清楚这一点。继续搜索意味着什么?

据我所知,这意味着如果 / g 搜索失败,则从头开始匹配。但 / g 修饰符不匹配整个字符串吗?

2 个答案:

答案 0 :(得分:32)

/g修饰符用于记住“字符串中的位置”,因此您可以逐步处理字符串。 e.g。

my $txt = "abc3de";
while( $txt =~ /\G[a-z]/g )
{
    print "$&";
}
while( $txt =~ /\G./g )
{
    print "$&";
}

因为在失败的匹配时重置了位置,所以输出

abcabc3de

/c标志不会重置失败匹配的位置。因此,如果我们将/c添加到第一个正则表达式,那么

my $txt = "abc3de";
while( $txt =~ /\G[a-z]/gc )
{
    print "$&";
}
while( $txt =~ /\G./g )
{
    print "$&";
}

我们最终

abc3de

示例代码:http://ideone.com/cC9wb

答案 1 :(得分:3)

在perldoc perlre http://perldoc.perl.org/perlre.html#Modifiers

  

全局匹配,并在匹配失败后保持当前位置。与i,m,s和x不同,这两个标志会影响正则表达式的使用方式而不是正则表达式本身。有关g和c修饰符的进一步说明,请参阅在perlretut中使用Perl中的正则表达式。

指定的参考导致:

http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl

此URI有一个名为“全局匹配”的子部分,其中包含一个小教程/工作示例,包括:

  

匹配失败或更改目标字符串会重置位置。如果您不希望在匹配失败后重置位置,请添加// c,如/ regexp / gc。字符串中的当前位置与字符串相关联,而不是正则表达式。这意味着不同的字符串具有不同的位置,并且可以独立设置或读取它们各自的位置。

HTH 利