[英]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.