2009-02-06 35 views
2

有誰可以告訴我如何識別中間部分interestedInThis和反向引用前綴:fontsize=12和後綴:fontstyle=bold${1}${2}如何在使用Perl正則表達式的已知標記之前和之後提取文本?

我處理這個字符串:

<fontsize=12 interestedInThis fontstyle=bold> 

附錄:對不起,我是不夠精確,這裏的細節:

  • 前綴和後綴可能是不存在的
  • 前綴和後綴可以是任何字符串,不一定是字體大小, fontstyle
  • 我知道,我在找什麼,即interestedInThis,它將通過空格分隔。

回答

3
<([^>]*)interestedInThis([^>]*)> 
+0

添加?或者它會是貪婪的,並匹配所有其他的字符串:<(fontsize = \ w +)\ s +(。*?)\ s +(fontstyle = \ w +)> – 2009-02-06 20:33:57

+0

或者,更好的辦法是改變。 *到\ S *(或\ S +,因爲我認爲它不應該匹配零字符)。雖然非貪婪*很有用,但指定你真正想要的東西總是比較好,而你在這裏想要的是非空白字符(\ S),而不是任何東西 - 但是換行符(。)。 – 2009-02-06 22:21:50

0

對於你的榜樣,這可能是工作

(<fontsize=\d+) (\w+) (fontstyle=bold>) 

不幸的是,Perl中似乎不支持命名的反向引用,所以我覺得你被卡住<fontsize=12 in $1, ImInterestedInThis in $2 & fontstyle=bold> in $3.

問候, 利芬

0

基本上

(<fontsize=12) (\S*) (fontstyle=bold>) 

但是,屬性值是否會改變?而且,你是否必須考慮變量空格?如果是這樣,上述變異爲:

(<fontsize=\d+)\s+(\S*)\s+(fontstyle=.*>) 

此外,在上面,通過使用\ S,interestedInThis可以包含任何不是空格。如果有空白有太多,例如interestedInThis其實是一樣的東西class="x" id="y",那麼也許:

(<fontsize=\d+)(.*)(fontstyle=.*>) 

注意$ 2 interestedInThis,和$ 1/$ 3上實際是您的最終作品。

0

試試這個:

my $result = m/(.*)(InterestedInThis)(.*)/; 

現在:

  • $result是真實的,如果它找到了一個匹配的格式。
  • InterestedInThis在$2,雖然你已經知道它是什麼。
  • 前綴(在「InterestedInThis」之前的所有內容)在$1
  • 後綴(「InterestedInThis」之後的所有內容)位於$3
0

我認爲這是你想要的;

<(.*)?InterestedInThis(.*)?> 

它將返回的前,後修復,如果他們在那裏,但仍然會匹配,如果只有一個或都不存在。

它確實有一個小問題,即空格將包含在標記的表達式中,但匹配後應該很容易刪除。

或者,你可以使用前瞻/回顧後嘗試的空間濾除隨着比賽的一部分:

<(.*(?=))? ?InterestedInThis ?((?<=).*)?> 
相關問題