我目前有這個:tr/[.]+(?=<)//d
它應該刪除所有字符(由[.]+
代表),直到第一個"<"
,因爲我使用的是積極的向前看。但由於某種原因,它將從字符串中刪除所有"."
和"<"
。如何創建一個Perl正則表達式來刪除第一個「<」之前的所有字符?
爲了記錄,我沒有使用正則表達式處理HTML或XML。
我目前有這個:tr/[.]+(?=<)//d
它應該刪除所有字符(由[.]+
代表),直到第一個"<"
,因爲我使用的是積極的向前看。但由於某種原因,它將從字符串中刪除所有"."
和"<"
。如何創建一個Perl正則表達式來刪除第一個「<」之前的所有字符?
爲了記錄,我沒有使用正則表達式處理HTML或XML。
字符含義改變。 [。]沒有任何意義,實際上與剛剛不同。所以 。在這種情況下從字面上解釋。
我想,這應該只是罰款:
$text =~ s/^.*?</</s;
之後就像一個魅力。謝謝。 – 2009-10-06 15:31:48
@Devin你爲什麼需要'sm'? – 2009-10-06 15:39:26
只是/ s可能是所有需要的 - 請參閱http://perldoc.perl.org/perlre.html#Modifiers - 如果第一個<不在第一行,我們需要。以匹配新的行。 – 2009-10-06 16:12:11
編輯,因爲它是澄清:在[]用作字符類時
if ($line =~ /^.+?<(.+)/) {
push @matched, $1;
}
@Oesor你是否試過這段代碼,其中包含多個'<'的行? – 2009-10-06 15:43:47
思南:好點。我剛剛回顧了這一點,如果我有一個日誌消息(出於某種原因),那麼我可能會得到意想不到的結果。 – 2009-10-06 15:45:27
今天我沒有想到 - 。*?會是正確的,只能匹配第一個<,是嗎? – Oesor 2009-10-06 16:33:08
你不想tr
。
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
last unless /\S/;
s/^.+?</</;
print;
}
__DATA__
a < b < c
a < b < c
那我想要什麼? – 2009-10-06 15:24:57
替換運算符'///'。 – 2009-10-06 15:26:53
^[^<]+
.
(點)的字符類內是一個字面點,不是通配符。
@SilentGhost如果在<<之前沒有字符,則不需要執行任何操作。 – 2009-10-06 15:29:24
它不會傷害:) – SilentGhost 2009-10-06 15:30:09
@SilentGhost在一般情況下,由於回溯和意想不到的匹配問題,使用'*'並不是一個好習慣。 – 2009-10-06 15:37:34
'。'在角色類中不是元字符。你也想要s///
,而不是tr
,它會替換單個字符。所以s/^.+(?=<)//
應該工作,雖然我個人會寫 s{^.*<}{<}
,以避免lookahead thingie。
@mirod如果在<<之前沒有字符,則不需要做任何替換。 – 2009-10-06 15:28:45
沒有必要,我只是覺得s /^.+(?=<)//難以閱讀。我必須暫停並記住?=是積極的向前看,我的大腦可以更快地解析s^^^<} {<} – mirod 2009-10-06 15:38:05
也不需要向前看。 's /^.+?'或's/^ [^ <] + //'更清潔。 – 2009-10-06 15:41:22
爲什麼你使用正則表達式來解析HTML? – 2009-10-06 15:21:32
我不是。日誌詳細信息(錯誤級別,時間戳記等)與消息分開。我只關心消息,所以我想剝去其他所有東西。 – 2009-10-06 15:22:21
'tr'方法不會執行元字符。你不能把正則表達式放進去。 – Telemachus 2009-10-06 15:23:19