我有一个包含ABCD.asd.qwe.com:/dir1
之类字符串的String变量。
我想提取ABCD
部分,即从.
开始到第一次出现的部分。问题是在.
之前几乎任何长度的字符(只有字母数字)。所以我创建了这个正则表达式。
if($arg =~ /(.*?\.?)/)
{
my $temp_name = $1;
}
然而它给我空白的字符串。逻辑是:
.*? - any character non-greedily
\.? - till first or none appearance of .
可能出现什么问题?
答案 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;
}
这将匹配第一个.
之前的任何内容。
如果您的输入可能在第一个.+
之后结束,则可以将.
更改为。*。
如果您确定在第一个.*?
之前始终至少有一个字符,则可以将第一个.+?
更改为.
。