2009-06-22 5 views
0

Perl에서 정규 표현식과 일치합니다. 두 줄 이상으로 퍼지는 문장. 내가 확산 경우긴 정규 표현식을 화면에 맞도록 작성하려면 어떻게해야합니까?

내가, 내가 한 줄에 일치하는 정규식 포함를 입력해야 실현 여러 줄에 실패 :

$array_11 =~ m{By Steve (.*), MarketWatch LONDON (.*) -- Shares of Anglo American rallied on Monday morning as (.*) bet that the mining group will reject a (.*)};' 

나는 그것을 할 수 없습니다 일치하는 것입니다 여러 라인을 작성하는 경우 이 문자열.

+4

왜 스칼라 변수 $ array_11을 (를) 호출하고 있습니까? –

+0

'string'의 고유 한 조합 수를 예상하고 있습니까? – TheMissingLINQ

답변

9

/x 수식어가 필요할 수 있습니다. perldoc perlre에서

:

x는 공백과 주석을 허용하여 패턴의 가독성을 확장합니다.

12

앞에서 언급 한 것처럼 x 수정자가 필요합니다. 그 변경자는 regexp의 모든 공백을 무시하고 (#으로 시작하는) 주석을 허용합니다. 당신은 당신이 []에 의해 정규 표현식에 일치하고 싶어 모든 공백을 대체하기 때문에 귀하의 경우에는

그것은,하지만 조금 추한, \ s 또는 \ S + :

$array_11 =~ m{By \s+ Steve \s+ (.*), \s+ 
       MarketWatch \s+ LONDON \s+ (.*) \s+ 
       -- \s+ Shares \s+ of \s+ Anglo \s+ American \s+ 
       rallied \s+ on \s+ Monday \s+ morning \s+ as \s+ 
       (.*) \s+ bet \s+ that \s+ the \s+ mining \s+ 
       group \s+ will \w+ reject \w+ a \w+(.*) 
       }x; 

그래서

my $sentence= q{By Steve (.*), MarketWatch LONDON (.*) } 
      . q{-- Shares of Anglo American rallied on Monday morning as (.*) } 
      . q{bet that the mining group will reject a (.*)} 
      ; 
my $array_11=~ m{$sentence}; 

마지막 코멘트 :이 배열 인 경우 $array_11는 강력한 코드 냄새가, 다음 배열, 몇 가지되지 스칼라 변수를 만들 실제로 나는 아마 다음처럼 작성할 수 있습니다.

+6

욕심쟁이를 사용하면 어리석은 양의 백 트레이싱을 얻게됩니다. * 사용할 때마다. * 문자를 모두 삼킨 다음 다음 부분을 완료 할 때까지 백 트레이스를 삼킨다. 비 욕심 많은. *? 적어도 다음 순서를 지켜 볼 것입니다. 그리고 나는 당신이 "Steve MarketWatch, MarketWatch LONDON"을 기대하고 있다고 기대하지 않습니다, 그래서. *? 당신이 나머지 캐릭터들을 조심하길 원한다는 것을 명시 적으로 * 만듭니다. – Axeman

+0

조숙 한 최적화 ... 좋아, 맞아, 나는 정규 표현식의 내용에 관심을 기울이지 않았다. 모든 싱글. *. *로 교체 하시겠습니까? 훨씬 더 효율적입니다. 감사. – mirod

+1

. * vs. *를 결정해야합니다. 모호한 경우에 일치시키려는 대상을 기반으로합니다. – ysth

1

모든 이스케이프 된 공백은 실제로보기 흉하고 혼란 스럽습니다.

my ($pattern) = map { qr/$_/ } join q{ }, split q{ }, <<'EOP'; 
    Steve (.*), MarketWatch LONDON (.*) -- 
    Shares of Anglo American rallied on Monday morning 
    as (.*) bet that the mining group will \w+ reject 
    \w+ a \w+(.*) 
EOP 

$text =~ $pattern; 

NB : 그래서, 여기에 대한 대안입니다 제가 영업 이익이 원하는 것을 알고 있지만, mirod's answer에 Axeman의 의견을 참조하지 않았기 때문에에 (.*)을 떠났다.

관련 문제