2009-10-06 62 views
1

我目前有這個:tr/[.]+(?=<)//d它應該刪除所有字符(由[.]+代表),直到第一個"<",因爲我使用的是積極的向前看。但由於某種原因,它將從字符串中刪除所有".""<"如何創建一個Perl正則表達式來刪除第一個「<」之前的所有字符?

爲了記錄,我沒有使用正則表達式處理HTML或XML。

+0

爲什麼你使用正則表達式來解析HTML? – 2009-10-06 15:21:32

+0

我不是。日誌詳細信息(錯誤級別,時間戳記等)與消息分開。我只關心消息,所以我想剝去其他所有東西。 – 2009-10-06 15:22:21

+1

'tr'方法不會執行元字符。你不能把正則表達式放進去。 – Telemachus 2009-10-06 15:23:19

回答

6

字符含義改變。 [。]沒有任何意義,實際上與剛剛不同。所以 。在這種情況下從字面上解釋。

我想,這應該只是罰款:

$text =~ s/^.*?</</s; 
+0

之後就像一個魅力。謝謝。 – 2009-10-06 15:31:48

+0

@Devin你爲什麼需要'sm'? – 2009-10-06 15:39:26

+0

只是/ s可能是所有需要的 - 請參閱http://perldoc.perl.org/perlre.html#Modifiers - 如果第一個<不在第一行,我們需要。以匹配新的行。 – 2009-10-06 16:12:11

1

編輯,因爲它是澄清:在[]用作字符類時

if ($line =~ /^.+?<(.+)/) { 
    push @matched, $1; 
} 
+1

@Oesor你是否試過這段代碼,其中包含多個'<'的行? – 2009-10-06 15:43:47

+1

思南:好點。我剛剛回顧了這一點,如果我有一個日誌消息(出於某種原因),那麼我可能會得到意想不到的結果。 – 2009-10-06 15:45:27

+0

今天我沒有想到 - 。*?會是正確的,只能匹配第一個<,是嗎? – Oesor 2009-10-06 16:33:08

6

你不想tr

#!/usr/bin/perl 

use strict; 
use warnings; 

while (<DATA>) { 
    last unless /\S/; 
    s/^.+?</</; 
    print; 
} 

__DATA__ 
a < b < c 
a < b < c 
+0

那我想要什麼? – 2009-10-06 15:24:57

+2

替換運算符'///'。 – 2009-10-06 15:26:53

3
^[^<]+ 

.(點)的字符類內是一個字面點,不是通配符。

+0

@SilentGhost如果在<<之前沒有字符,則不需要執行任何操作。 – 2009-10-06 15:29:24

+0

它不會傷害:) – SilentGhost 2009-10-06 15:30:09

+1

@SilentGhost在一般情況下,由於回溯和意想不到的匹配問題,使用'*'並不是一個好習慣。 – 2009-10-06 15:37:34

3

'。'在角色類中不是元字符。你也想要s///,而不是tr,它會替換單個字符。所以s/^.+(?=<)//應該工作,雖然我個人會寫 s{^.*<}{<},以避免lookahead thingie。

+1

@mirod如果在<<之前沒有字符,則不需要做任何替換。 – 2009-10-06 15:28:45

+0

沒有必要,我只是覺得s /^.+(?=<)//難以閱讀。我必須暫停並記住?=是積極的向前看,我的大腦可以更快地解析s^^^<} {<} – mirod 2009-10-06 15:38:05

+3

也不需要向前看。 's /^.+? 2009-10-06 15:41:22

相關問題