这些Perl正则表达式意味着什么?

时间:2009-06-19 00:09:55

标签: regex perl

以下语法在Perl中意味着什么?

$line =~ /([^:]+):/;

$line =~ s/([^:]+):/$replace/;

7 个答案:

答案 0 :(得分:11)

请参阅perldoc perlreref

[^:]

是一个匹配':'以外的任何字符的字符类。

[^:]+

表示匹配一个或多个此类字符。

我不确定是否需要捕获括号。无论如何,

([^:]+):

捕获一个或多个非冒号字符的序列,后跟冒号。

答案 1 :(得分:4)

$line =~ /([^:]+):/;

=〜运算符称为binding operator,它针对标量值(在本例中为$ line)运行regexsubstitution。至于正则表达式本身,()指定了一个捕获。捕获将与它们匹配的文本放在特殊的全局变量中。这些变量从1开始编号,并且对应于括号显示的顺序,因此给出

"abc" =~ /(.)(.)(.)/;

$1变量将包含"a"$2变量将包含"b"$3变量将包含"c"(如果你还没有猜到.匹配一个字符*)。 []指定一个字符类。字符类将匹配其中的一个字符,因此/[abc]/将匹配一个字符"a""b""c"。使用^启动字符类可以取消它们。否定字符类匹配其中未列出的一个字符,因此[^abc]将匹配一个不是"a""b""c"的字符(例如{ {1}}将匹配)。 "d"称为量词。量词会告诉你前面的模式必须匹配多少次。 +要求模式匹配一​​次或多次。 (+量词要求模式匹配零次或多次)。 *对正则表达式引擎没有特殊意义,因此它只意味着文字:

因此,将这些信息放在一起我们可以看到正则表达式将匹配一个或多个非冒号字符(将此部分保存到:)后跟冒号。

$1

这是替代品。替换有两部分,正则表达式和替换字符串。正则表达式部分遵循与普通正则表达式相同的所有规则。替换部件被视为双引号字符串。替换取代了正则表达式与替换的匹配,因此给出以下代码

$line =~ s/([^:]+):/$replace/;

$ line变量将保存字符串my $line = "key: value"; my $replace = "option"; $line =~ s/([^:]+):/$replace/;

您可能会发现阅读perldoc perlretut很有用。

除了换行符之外的

"option value",除非使用/ m选项,在这种情况下它匹配任何字符

答案 2 :(得分:3)

第一个从一行中捕获冒号前面的部分,例如字符串“abc:foo”中的“abc”。更准确地说,它在冒号之前直接匹配至少一个非冒号字符(尽可能多)(并尽可能多地将它们放入捕获组中)。

第二个替换所述部分,虽然这次包括冒号变量$replace的内容。

答案 3 :(得分:3)

我可能误解了之前的一些答案,但我认为第二个例子存在混淆。通过$替换,仅替换捕获的项目(即直到冒号的一个或多个非冒号)。它将用([^:]+):替换所有$replace - 冒号。 (替换对匹配进行操作,而不仅仅是捕获。)

这意味着如果你在$replace中没有包含冒号(并且你想要一个冒号),你会得到一点:

my $line = 'http://www.example.com/';
my $replace = 'ftp';
$line =~ s/([^:]+):/$replace/;
print "Here's \$line now: $line\n";

输出:

Here's $line now: ftp//www.example.com/ # Damn, no colon!

我不确定你是否只是在查看示例代码,但除非你计划使用捕获,否则你不确定在这些示例中是否真的需要它。

如果您对正则表达式(或Perl)非常不熟悉,在尝试perldoc perlrequickperldoc perlre之前,应先查看perldoc perlretut

答案 4 :(得分:1)

你想要返回一个匹配一个或多个字符的东西,但是:后跟一个:和第二个你要做同样的事情,但用$ replace替换它。

答案 5 :(得分:1)

perl -MYAPE :: Regex :: Explain -e“print YAPE :: Regex :: Explain-> new('([^:] +):') - >解释”

The regular expression:

(?-imsx:([^:]+):)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^:]+                    any character except: ':' (1 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  :                        ':'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 6 :(得分:0)

$line =~ /([^:]+):/;

匹配任何不包含的内容:之前:/

如果$ line =“http://www.google.com”,它将匹配http(变量$ 1将包含http)

$line =~ s/([^:]+):/$replace/;

这次,替换变量$ replace

的内容所匹配的值