2013-07-03 64 views
0

我正在製作符合html代碼中某些條款的正則表達式。我在迭代過程中這樣做,以減少比賽排除我不想要的東西。所以我製作了一個正則表達式,運行它,然後吐出數據,然後查看我的匹配效果如何。例如,如果我在尋找術語「tema」(提供標準的貿易協會的名稱),我可能會注意到它也與「站點地圖」匹配,並以某種方式更改我的正則表達式以排除不需要的項目。如何在perl正則表達式匹配之前和之後抓取一定數量的字符?

爲了使這更容易,我想打印出我的匹配以及一些上下文,比如在匹配之前和之後說20個字符,而不是整行,以便更容易地掃描結果。這很難以簡單的方式完成。

例如,我認爲這會工作:

$line =~ /(.{,20}tema.{,20})/i;

也就是說,我要投其所好,以我的關鍵字前後什麼20,包括它的「上下文」我打印進行掃描。

但它沒有。我在這裏錯過了什麼嗎?如果一個{,20}匹配20個'a'字符,爲什麼不匹配20個'。'。會匹配嗎?

撓我的頭。

+0

什麼你是不是指'它不'?你的角色少了嗎?沒有字符?不匹配?一個錯誤?請注意'.'不能匹配換行符。如果要在這些任意字符中包含換行符,請使用's'修飾符。 –

+0

我不認爲你的代碼示例是正確的。 –

+0

它不會返回任何東西。沒有匹配。 –

回答

0

如何使用m/^(.*)tema(.*)$/進行搜索,然後使用substr或類似名稱來獲取$1的最後一個字符以及從$2開始的第一個字符。

+0

這就是我現在正在做的事情(但在$/$,/ $和/'之前/匹配/之後的字符串),但它很混亂。我希望能夠在正則表達式中做到這一切,所以我只有一條線而不是8條。 –

1

語法:

  • atom{n}(確切地Ñ
  • atom{n,}Ñ或多個)
  • atom{n,m}Ñ以上,但不超過

所以,

say $1 if $line =~ /(.{0,20}tema.{0,20})/i; 

或者,如果你使用/g,並可能會重疊的匹配:

say "$1$2$3" while $line =~ /(.{0,20})\K(tema)(?=(.{0,20}))/ig; 

a{,20}不 「匹配到20個a字符」。)

+0

美麗的感謝。我認爲把零點放在。{0,20}是。我發現perl正則表達式教程中的某處語法,但顯然它是錯誤的。 –

+0

@Peter C,可能是另一種語言的正則表達式。 – ikegami

相關問題