簡體   English   中英

Perl正則表達式替換問題

[英]Perl Regex substitution issue

我正在嘗試使用正則表達式從分號分隔的字符串中刪除令牌。 示例字符串如下所示:

Field1=Blah;Field2=Bluh;Field3=Dingdong;Uid=John;Pwd=secret;Field4=lalali Field1=Blah;Field2=Bluh;Field3=Dingdong;Uid=John;Pwd=secret;Field4=lalali;

因此,我想在單獨的命令中刪除“ Uid”和“ Pwd”令牌,以免刪除任何尾隨令牌(例如,Field4應該保留在末尾)。

我目前的嘗試是:

$mystring =~s /Uid=.+;//i;

產生

Field1=Blah;Field2=Bluh;Field3=Dingdong;Field4=lalali

它適用於第一行,但不適用於第二行,結尾是分號,它會產生

Field1=Blah;Field2=Bluh;Field3=Dingdong;

並錯誤地刪除了Field4。 我嘗試了多種變體,例如

$mystring =~s /Uid=.+;?//i; $mystring =~s /Uid=.+;+?//i;

沒有成功。 我意識到我需要告訴Regex只匹配第一個分號,但是我不知道如何匹配。

現在,只是為了讓我看起來不完全愚蠢,我可以通過以下操作使其正常工作:

$mystring =~s /Uid=[^;]+;//i;

但是我仍然想知道為什么我不能告訴表達式只匹配第一個分號...

當使用+*等量詞時,它們是貪婪的。 它們會吞噬盡可能多的字符,並且僅在被迫回溯時才將它們退還給他們。 模式.*; 因此將匹配所有內容,直到最后一個分號為止。

也許貪婪的量詞應該節食。 我們可以通過使用惰性版本來強制它們: +? *? 這些將盡早終止。 因此,模式將是:

/Uid=.+?;/  # repeat for Pwd

匹配到第一個分號

此方法有效,但寧可使用否定的字符類代替帶有的非貪婪量詞,也被認為是一種好風格. 類:

/Uid=[^;]+;/

因為可以通過更少的方式來解決問題(例如刪除該行的其余部分)。 它也比其他解決方案更明確。

如果您不想使用否定的字符類(將與大多數正則表達式軟件包一起使用),則可以使用非貪婪的量詞來匹配關鍵字后面的數據(但僅適用於與Perl兼容的正則表達式軟件包)。 有關更多信息,請參見正則表達式下的量詞。

$mystring =~s /Uid=.+?;//i;

多余的問號使+不貪心; 它使用將匹配的最小字符串而不是最大字符串,因此它將不匹配任何分號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM