2013-03-01 2 views
0

텍스트 파일에서이 세 가지 유형의 텍스트를 모두 일치시키는 최적의 정규 표현식이 필요합니다.세 가지 다른 패턴에 대해 단일 정규식이 작동하지 않습니다.

  1. [TRUE, FALSE]
  2. [4,5,6,7]
  3. [2-15] 내가

    를 작동하지 않는 경우 다음과 같은 정규식 일치를 시도하고

m/([0-9A-Fa-fx,]+)\s*[-~,]\s*([0-9A-Fa-fx,]+)/) 
+1

당신이 무엇을 의미합니까'working'하지? – Toto

+0

TRUE의 T, R 및 U가 정규 표현식과 일치하지 않습니다 – orique

답변

2

4-72-15의 하위 집합입니다. 이 정규식을 캡처해야합니다

/TRUE|FALSE|[2-9]|1[0-5]/ 
+0

이것이 [4,5,6,7]과 어떻게 일치 할 수 있는지 알 수 없습니다. 제 말은 일치하지만 첫 번째 십진수 만 나타냅니다. 나는 당신이 (불완전한) 문제 설명으로 너무 많이 해석하고 있다고 생각한다. – memowe

3
/ 
    (?(DEFINE) 
     (?<WORD> [a-zA-Z]+) 
     (?<NUM> [0-9]+) 
    ) 

    \[ \s* 
    (?: (?&WORD) (?: \s* , \s* (?&WORD))+ 
    | (?&NUM) (?: \s* , \s* (?&NUM))+ 
    | (?&NUM) \s* - \s* (?&NUM) 
    ) 
    \s* \] 
/x 
+0

명명 된 캡처를위한 Upvote. 그러나 5.10+. – rjh

+0

@rjh 5.10 기능을 사용하지 않으려면 정의를 인라인 할 수 있지만 변경하려면 두 개 또는 네 곳의 정의를 편집해야합니다. – ikegami

0

quick'n'dirty 테스트 프로그램 :

#!/usr/bin/env perl 

use strict; 
use warnings; 

for my $line (<DATA>) { 

    chomp $line; 
    print "$line: "; 

    if ($line =~/
      ^         # beginning of the string 
      \[         # a literal opening sq. bracket 
      (         # alternatives: 
        (TRUE|FALSE) (,(TRUE|FALSE))*  # one or more thruth words 
       | (\d+) (,\d+)*      # one or more numbers 
       | (\d+) - (\d+)      # a range of numbers 
      )         # end of alternatives 
      \]         # a literal closing sq. bracket 
      $         # end of the string 
     /x) { 

     print "match\n"; 
    } 
    else { 
     print "no match\n"; 
    } 
} 

__DATA__ 
[TRUE] 
foo 
[FALSE,TRUE,FALSE] 
[FALSE,TRUE,] 
[42,FALSE] 
[17,42,666] 
bar 
[17-42] 
[17,42-666] 

출력 :

[TRUE]: match 
foo: no match 
[FALSE,TRUE,FALSE]: match 
[FALSE,TRUE,]: no match 
[42,FALSE]: no match 
[17,42,666]: match 
bar: no match 
[17-42]: match 
[17,42-666]: no match 
관련 문제