我嘗試了幾種最後一次出現的方式,但它們不起作用。以下是我的情況,捕獲最後一次出現的模式的正則表達式
abc def = ghi
abc def ghi = jkl
abc def ghi=jkl mno
對於第一行,我的捕獲目標是「def」。對於第二行,我的捕獲目標是「ghi」,對於第三行,我的捕獲目標是「ghi」。目標可以口頭表達爲「等號前最後一次出現的單詞」。
Perl的正則表達式應該是什麼樣子?
我嘗試了幾種最後一次出現的方式,但它們不起作用。以下是我的情況,捕獲最後一次出現的模式的正則表達式
abc def = ghi
abc def ghi = jkl
abc def ghi=jkl mno
對於第一行,我的捕獲目標是「def」。對於第二行,我的捕獲目標是「ghi」,對於第三行,我的捕獲目標是「ghi」。目標可以口頭表達爲「等號前最後一次出現的單詞」。
Perl的正則表達式應該是什麼樣子?
,你可以使用這個模式
(\w+)(?=\s*=)
( # Capturing Group (1)
\w # <ASCII letter, digit or underscore>
+ # (one or more)(greedy)
) # End of Capturing Group (1)
(?= # Look-Ahead
\s # <whitespace character>
* # (zero or more)(greedy)
= # "="
) # End of Look-Ahead
\b(\w+)\s*=
就能滿足你的例子。它匹配一個字,緊隨其後的是空格,緊接着是=
。 \b
減少回溯。
\b(\w+)[^\w=]*=
更精確地匹配您的「語言表達」。例如,它將在abc [email protected]# = def
中匹配abc
。
\b
一個\w
和\W
之間的匹配。\w
匹配一個非單詞字符。\W
匹配不是單詞字符的字符。\s
匹配一個空白字符。[^\w=]
與除=
以外的非單詞字符匹配。你也不需要正則表達式。您可以:
split
上/\s*=\s*/
split
(即所有之前等號(含空格剝離右端)的東西)的第一個字符串從步驟2的/\s+/
換句話說:
use strict;
use warnings;
my $str1 = "abc def = ghi";
my $str2 = "abc def ghi = jkl";
my $str3 = "abc def ghi=jkl mno";
sub grab_target{
my $str = shift;
return (split(/\s+/, (split(/\s*=\s*/, $str))[0]))[-1];
}
foreach my $str ($str1, $str2, $str3){
print grab_target $str;
print "\n";
}
輸出的結果是:
def
ghi
ghi
傑克的回答可能是最好的,但我不能換我圍繞它是如何工作的頭。我喜歡把事情分解成更小的塊。
use warnings;
use strict;
my @strings = ("abc def = ghi",
"abc def ghi = jkl",
"abc def ghi=jkl mno"
);
#
foreach (@strings) {
my $last = get_last($_);
print "$last\n";
}
sub get_last {
my $string = shift;
# group things as left side or right side
my $left_side;
my $right_side;
if ($string =~ /(.*)=(.*)/) {
$left_side = $1;
$right_side = $2;
}
# split things according to whitespace and store in an array
my @left_side = split (/\s+/, $left_side);
# return the last element of that array
return $left_side[-1];
}
是的,它有點緊湊......實質上,直接從split分割的數組中獲取索引元素 - 即split(/ \ s * = \ s * /,$ str)[0]'是一個語法錯誤。所以,你必須將'split'包裝在括號中,如下所示:'(split(/ \ s * = \ s * /,$ str))[0]'。其餘部分將該元素分割到'/ \ s + /'上,並抓取該結果數組的最後一個元素。希望能夠解決問題。你的寫作也很好。 :) – 2015-02-06 18:36:42
這裏預見的唯一功能是減慢匹配。 – ikegami 2015-02-05 17:51:11
我使用後視,因爲我認爲它是從「=」號後面找到最接近的單詞。但後視對我來說不起作用。 – Allen 2015-02-06 08:15:13
@Allen,你不能在這裏使用lookbehind,因爲lookbehinds匹配的長度必須獨立於輸入。即使它確實有效,使用lookbeind也會讓事情變得緩慢。我很失望你接受了這個不合理的解決方案 – ikegami 2015-02-06 16:58:50