簡體   English   中英

Perl非貪婪正則表達式

[英]Perl non-greedy Regex

因此,我終於讓我的老板批准為此目的使用perl而不是sed。

這是基本的雜項。

我有這樣的行:

<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div>

這太亂了,但我沒有寫。 無論哪種方式,都有很多這樣的頁面,需要將其更改為以下格式:

<p>Sometext</p><p>Some more text</p>

顯然,這需要不貪心。 現在,我想出了這條線來幫助解決這個問題:

perl -nle "s/(.*)<div class=\"SectionText\">(.*?)<\/div>(.*)/\1<p>\2<\/p>\3/ig; print $1" "somefile.html" > otherfile.html

但是,此操作不執行任何操作,並且所有SectionText標簽仍然保留。

請注意,正則表達式遠非適合處理HTML。 正確的方法是使用解析器並處理DOM,但是對於簡單且行為良好的情況,您可以不使用正則表達式。 只是要進一步了解這是設計的弱點,並且可能會導致意外的問題。

無需捕獲和還原要編輯區域之外的文本。 只需將<div>元素替換為具有相同內容的<p>元素。 只要選擇其他定界符,也無需轉義雙引號或斜杠。

在替換字符串中使用\\1\\2等也是錯誤的。 $1$2等都屬於這里,如果您在命令行上使用-w ,將會被警告過。

這應該為你工作

perl -pe 's|<div class="SectionText">(.*?)</div>|<p>$1</p>|ig' somefile.html > otherfile.html

有關輸出方法,請參見HTML :: TreeBuilder :: XPathHTML :: Element

my $t = HTML::TreeBuilder::XPath
    ->new_from_content('<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div>');
for ($t->findnodes('//div[@class="SectionText"]')) {
    $_->tag('p');
    $_->attr(class => undef);
}

若要使其100%正確,應在空白處拆class屬性值,刪除類名稱SectionText ,然后重新組合屬性值。 我認為在您的情況下,您可以刪除上面的代碼中的class屬性,從而擺脫困境。

暫無
暫無

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

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