Perl正则表达式提取子字符串?

时间:2013-05-06 09:10:54

标签: regex perl

我有一个包含ABCD.asd.qwe.com:/dir1之类字符串的String变量。 我想提取ABCD部分,即从.开始到第一次出现的部分。问题是在.之前几乎任何长度的字符(只有字母数字)。所以我创建了这个正则表达式。

if($arg =~ /(.*?\.?)/)
{
    my $temp_name = $1;
}

然而它给我空白的字符串。逻辑是:

.*? - any character non-greedily
\.? - till first or none appearance of .

可能出现什么问题?

4 个答案:

答案 0 :(得分:3)

您可以改为使用负面字符类

^[^.]+

[^.]会匹配除.

之外的任何字符

[^.]+会匹配1到多个字符(.除外)

^描述了字符串

的开头

^.+?(?=\.|$)

(?=)是一个前瞻,用于检查当前位置之后的特定模式。对于带有正则表达式abcdad的文本a(?=b),只有a匹配

$描述了行尾(如果与多行选项一起使用)或字符串结尾(如果与单行选项一起使用)

答案 1 :(得分:3)

\.?并不意味着“直到.首次出现”。这意味着“这里是.”。


如果字符串的第一个字符是.

  • .*?匹配位置0的0个字符。
  • \.?匹配位置0的1个字符。

$1包含.


如果字符串的第一个字符不是.

  • .*?匹配位置0的0个字符。
  • \.?匹配位置0的0个字符。

$1为空。


要匹配ABCD,以下情况可以:

/^(.*?)\./

但是,我讨厌非贪婪的修饰语。它是脆弱的,在某种意义上,如果你在同一模式中使用两个,它就会停止做你想要的。我会使用以下代码(“匹配非句号”):

/^([^.]*)\./

甚至只是

/^([^.]*)/

答案 2 :(得分:2)

use strict;

my $string = "ABCD.asd.qwe.com:/dir1";

$string =~ /([^.]+)/;
my $capture = $1;
print"$capture\n";

或者您也可以使用 Split 等功能,

my $sub_string = ( split /\./, $string )[0];
print"$sub_string\n";

一般注意:有关正则表达式的解释(了解复杂的正则表达式),请查看YAPE::Regex::Explain模块。

答案 3 :(得分:0)

这应该有效:

if($arg =~ /(.*?)\..+/)
{
    my $temp_name = $1; 
} 

这将匹配第一个.之前的任何内容。 如果您的输入可能在第一个.+之后结束,则可以将.更改为。*。 如果您确定在第一个.*?之前始终至少有一个字符,则可以将第一个.+?更改为.