2009-10-06 3 views
1

저는 현재 : tr/[.]+(?=<)//d입니다. 긍정적 인 선견문을 사용하고 있기 때문에 모든 문자 ([.]+으로 표시)를 첫 번째 "<"까지 제거해야합니다. 그러나 어떤 이유에서 문자열에서 모두 ".""<"을 제거하고 있습니다.첫 번째 "<"전에 모든 문자를 제거하는 Perl 정규식을 만드는 방법은 무엇입니까?

레코드의 경우 HTML 또는 XML을 정규식으로 처리하지 않습니다. 이 명확하게되면서

+0

왜 정규식을 사용하여 HTML을 구문 분석합니까? –

+0

아니에요. 로그 세부 사항 (오류 레벨, 시간 소인 등)은 <로 메시지와 구분됩니다. 나는 메시지에 대해서만 관심이 있으므로 다른 모든 것을 제거하려고합니다. –

+1

'tr' 메쏘드는 메타 문자를 사용하지 않습니다. 정규식을 넣을 수는 없습니다. – Telemachus

답변

6

의미는 변경합니다. [.] 의미가 없습니다. 정말로, 단지 다른 것과는 다릅니다. 그래서 . 그 맥락에서 말 그대로 해석된다.

나는이 잘 작동해야한다고 생각 : 당신은 tr을 원하지 않는

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

매력처럼 작동합니다. 감사. –

+0

@Devin 왜 'sm'이 필요한가요? –

+0

그냥/s가 필요할 것입니다. http://perldoc.perl.org/perlre.html#Modifiers를 참조하십시오. 첫 번째 줄이 첫 줄에 없으면. 새로운 라인을 맞추기. –

1

편집 : 문자 클래스로 []에 사용할 때 문자의

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

@Oesor이 코드에'<'가 두 개 이상있는 줄을 사용 해본 적이 있습니까? –

+1

시안 : 좋은 지적. 나는 이것에 대해서 다시 살펴 봤는데, 어떤 이유로 든 <안에 로그 메시지가 있다면 예기치 않은 결과가 나타날 수 있습니다. –

+0

오늘은 생각하지 않습니다. *? 첫 번째 <, 예? – Oesor

6

. 문자 클래스 내

#!/usr/bin/perl 

use strict; 
use warnings; 

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

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

그러면 무엇을 원하니? –

+2

대입 연산자's ///'. –

3
^[^<]+ 

. (점) 리터럴 점,하지 와일드 카드입니다.

+0

@SilentGhost'<'앞에 문자가 없으면 아무 것도 할 필요가 없습니다. –

+0

그것은 해를 끼치 지 않을 것입니다. – SilentGhost

+1

@SilentGhost 일반적으로, 역 추적과 예기치 않은 일치 문제 때문에'+'를 의미 할 때'*'를 사용하는 것은 좋은 습관이 아닙니다. –

3

'.' 문자 클래스에서 메타 문자가 아닙니다. 또한 한 문자를 대체하는 s///이 아니라 tr이 필요합니다. 그래서 s/^.+(?=<)//가 작동해야합니다. 개인적으로는 lookahead thingie를 피하기 위해 s{^.*<}{<}이라고 써야합니다.

+1

@mirod'<'앞에 문자가 없으면 대체 할 필요가 없습니다. –

+0

필요가 없습니다. 나는 단지 s /^.+(?=< mirod

+3

미리보기가 필요 없다. 's /^.+?

관련 문제