2013-05-11 6 views
1

프리 컴파일 된 정규 표현식을 다른 정규 표현식과 비교하는 우아한 방법이 있을까요? 나는 그렇지 않다고 생각하지만 여전히 물어보기로했다.Perl에서 다른 정규 표현식과 정규 표현식 일치하기

말, 특정 패턴에 해당하는 Puppet의 node.pp에있는 모든 노드를 찾고 싶습니다. 문제는 노드 이름을 정규식으로 정의 할 수 있다는 것입니다. 예를 들어, '생산'환경에서 모든 노드를 찾아야 할 수도 있는데, 관습에 따라 'p'다음에 1 또는 2가 붙습니다. /^p[12].+$/. 즉,

p(1|2)proxy-[1-4].domain.lan 
p1smtp-[1-2].domain.lan 
p[12]what-not-[1-8].domain.lan 

는 일치

q(1|2)proxy-[1-4].domain.lan 
q(1|2)smtp-[1-2].domain.lan 
q(1|2)what-not-[1-8].domain.lan 

이 안 반면한다.

대상 문자열 (정규식으로 컴파일 된 경우)은보다 일반적인 표현식의 모든 하위 사례입니다. 바로 가기가 있다면 궁금합니다.

물론 '정규식'변형을 비롯한 리터럴 문자열로 노드 이름을 일치시킬 수 있습니다. 특정 경우에는 어렵지 않아야합니다.

+0

그래서 어떤 정규 표현식과 비교하고 싶습니까? 'p (1 | 2) proxy- [1-4] .domain.lan'도'^ p [12]. + $'와 일치하는지 확인하고 싶습니까? 이 regexes는 어디서 오는가? 특히 두 번째 세트. – Borodin

+0

@Borodin : 좀 더 구체적인 정규 표현식 문자열과 일치시키기 위해서는 좀 더 일반적인 정규 표현식이 필요합니다. regex-like 문자열이 어떤 방식으로 문자열이 아닌 regexes로 해석 될 수 있다면 더 쉽게 할 수 있습니다. 이 예제는 Puppet의 node.pp 파일에서 가져온 것입니다. 이제 질문에 대한 답을 얻었습니다. 아래를보십시오. – badbishop

답변

4

"생각하면 CPAN 모듈이 있습니다." Perl의 규칙 34와 같습니다.

두 개의 regexp 문자열을 제공 할 때 실제로 하나의 정규 표현식이 다른 표현식의 실제 하위 집합과 일치하는지 결정할 수있는 Regexp::Compare입니다. 이 사실을 알기 위해 입력 정규 표현식을 처음부터 고정 시켰습니다. is_less_or_equal$rx이 일치하는 모든 문자열과 일치 할 수있는 경우 $metarx이 true를 반환합니다.

use strict; use warnings; use 5.010; 
use Regexp::Compare qw(is_less_or_equal); 

my @rx = (
    'p(1|2)proxy-[1-4].domain.lan', 
    'p1smtp-[1-2].domain.lan', 
    'p[12]what-not-[1-8].domain.lan', 
    'q(1|2)proxy-[1-4].domain.lan', 
    'q(1|2)smtp-[1-2].domain.lan', 
    'q(1|2)what-not-[1-8].domain.lan', 
); 
my $metarx = '^p[12]'; 

for my $rx (@rx) { 
    say "/$metarx/ ≥ /^$rx/ ?\t", is_less_or_equal("^$rx", $metarx) ? "yes" : "no"; 
} 

출력 :

/^p[12]/ ≥ /^p(1|2)proxy-[1-4].domain.lan/ ? yes 
/^p[12]/ ≥ /^p1smtp-[1-2].domain.lan/ ?   yes 
/^p[12]/ ≥ /^p[12]what-not-[1-8].domain.lan/ ? yes 
/^p[12]/ ≥ /^q(1|2)proxy-[1-4].domain.lan/ ? no 
/^p[12]/ ≥ /^q(1|2)smtp-[1-2].domain.lan/ ?  no 
/^p[12]/ ≥ /^q(1|2)what-not-[1-8].domain.lan/ ? no 

나는 이것이 당신이 마음에 무엇을했다 않습니다 생각합니다. (참고 : regex 객체를 사용하지 말고 일반 문자열 만 사용하십시오.이 모듈은 일부 문자열을 사용하는 데 어려움이있을 수 있습니다.)

+0

네, 고마워요, 제가 정확히 염두에 두었던 것입니다. 글쎄, 내 생각은 약간의 최첨단 내장 기능 이었지만, CPAN 모듈이 작동한다면 - 나에 의해 멋지다! – badbishop

관련 문제