저는 현재 : tr/[.]+(?=<)//d
입니다. 긍정적 인 선견문을 사용하고 있기 때문에 모든 문자 ([.]+
으로 표시)를 첫 번째 "<"
까지 제거해야합니다. 그러나 어떤 이유에서 문자열에서 모두 "."
및 "<"
을 제거하고 있습니다.첫 번째 "<"전에 모든 문자를 제거하는 Perl 정규식을 만드는 방법은 무엇입니까?
레코드의 경우 HTML 또는 XML을 정규식으로 처리하지 않습니다. 이 명확하게되면서
저는 현재 : tr/[.]+(?=<)//d
입니다. 긍정적 인 선견문을 사용하고 있기 때문에 모든 문자 ([.]+
으로 표시)를 첫 번째 "<"
까지 제거해야합니다. 그러나 어떤 이유에서 문자열에서 모두 "."
및 "<"
을 제거하고 있습니다.첫 번째 "<"전에 모든 문자를 제거하는 Perl 정규식을 만드는 방법은 무엇입니까?
레코드의 경우 HTML 또는 XML을 정규식으로 처리하지 않습니다. 이 명확하게되면서
의미는 변경합니다. [.] 의미가 없습니다. 정말로, 단지 다른 것과는 다릅니다. 그래서 . 그 맥락에서 말 그대로 해석된다.
나는이 잘 작동해야한다고 생각 : 당신은tr
을 원하지 않는
$text =~ s/^.*?</</s;
매력처럼 작동합니다. 감사. –
@Devin 왜 'sm'이 필요한가요? –
그냥/s가 필요할 것입니다. http://perldoc.perl.org/perlre.html#Modifiers를 참조하십시오. 첫 번째 줄이 첫 줄에 없으면. 새로운 라인을 맞추기. –
편집 : 문자 클래스로 []에 사용할 때 문자의
if ($line =~ /^.+?<(.+)/) {
push @matched, $1;
}
@Oesor이 코드에'<'가 두 개 이상있는 줄을 사용 해본 적이 있습니까? –
시안 : 좋은 지적. 나는 이것에 대해서 다시 살펴 봤는데, 어떤 이유로 든 <안에 로그 메시지가 있다면 예기치 않은 결과가 나타날 수 있습니다. –
오늘은 생각하지 않습니다. *? 첫 번째 <, 예? – Oesor
. 문자 클래스 내
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
last unless /\S/;
s/^.+?</</;
print;
}
__DATA__
a < b < c
a < b < c
그러면 무엇을 원하니? –
대입 연산자's ///'. –
^[^<]+
.
(점) 리터럴 점,하지 와일드 카드입니다.
@SilentGhost'<'앞에 문자가 없으면 아무 것도 할 필요가 없습니다. –
그것은 해를 끼치 지 않을 것입니다. – SilentGhost
@SilentGhost 일반적으로, 역 추적과 예기치 않은 일치 문제 때문에'+'를 의미 할 때'*'를 사용하는 것은 좋은 습관이 아닙니다. –
'.' 문자 클래스에서 메타 문자가 아닙니다. 또한 한 문자를 대체하는 s///
이 아니라 tr
이 필요합니다. 그래서 s/^.+(?=<)//
가 작동해야합니다. 개인적으로는 lookahead thingie를 피하기 위해 s{^.*<}{<}
이라고 써야합니다.
@mirod'<'앞에 문자가 없으면 대체 할 필요가 없습니다. –
필요가 없습니다. 나는 단지 s /^.+(?=</// 읽기가 더 힘듭니다. 나는 멈추고 기억해야만 하는가? =는 긍정적 인 선견자이며, 내 뇌는 더 빨리 파싱 할 수있다. – mirod
미리보기가 필요 없다. 's /^.+?'또는's/^ [^ <] + //'이 더 깨끗합니다. –
왜 정규식을 사용하여 HTML을 구문 분석합니까? –
아니에요. 로그 세부 사항 (오류 레벨, 시간 소인 등)은 <로 메시지와 구분됩니다. 나는 메시지에 대해서만 관심이 있으므로 다른 모든 것을 제거하려고합니다. –
'tr' 메쏘드는 메타 문자를 사용하지 않습니다. 정규식을 넣을 수는 없습니다. – Telemachus