2013-07-22 3 views
4

정규식에서 OR (파이프)을 사용하는 경우 일치하는 표현식 부분을 가져 오는 편리한 방법이 있습니다.일치하는 정규식 부분을 반환합니다

예 :

/horse|caMel|TORTOISe/i.exec("Camel"); 

반환 Camel. 내가 원하는 건 caMel입니다.

하나의 큰 정규 표현식을 사용하는 대신 옵션을 반복 할 수 있다는 것을 알고 있습니다. 그것은 훨씬 더 의미가 있습니다. 그러나 나는 그것이 이런 식으로 할 수 있는지 알고 싶다.

+0

명확하게 말하면 일치하는 문자열이 아닌 정규 표현식을 반환하려고합니까? – Mathletics

+0

해당 예제를 기반으로 일치하는 항목을 반환했습니다. 당신은 explicitly 텍스트 ** 사례 ** 무시하고 ** 낙타 ** 일치하는 정규식 말했다. 그래서, 그것은 문자열 입력을 반환했습니다. –

답변

5

매우 간단합니다.

정규 표현식은 정규 표현식을 만드는 데 사용 된 텍스트가 아닌 입력 문자열과 관련이 있습니다. 이 텍스트는 손실 될 수 있으며 이론적으로는 필요하지 않습니다. 동등한 정규은 이런 식의 내장 될 수있다 :

var test = function(str) { 
    var text = str.toLowerCase(); 
    return text === "horse" || text === "camel" || text === "tortoise"; 
}; 

그것을 생각하는 또 다른 방법은 정규 표현식의 컴파일이 자신의 텍스트 표현에서 함수의 논리를 이혼 할 수 있다는 것입니다. 그것은 한 방향입니다.

죄송합니다.

3

Javascript RegExp 객체에는 기본 제공 방법이 없습니다. 표현을 바꾸지 않고. 가장 가까운 값은 source이며 전체 표현식을 문자열로 반환합니다. 당신이 표현 | OR의 일련의 것 알고 있기 때문에, 당신은 그룹을 캡처 할 수

그룹이 일치하는 파악하고, 해당 그룹의 내용을 알아 .source와 그 결합하기 :

var exp = /(horse)|(caMel)|(TORTOISe)/i; 
var result = exp.exec("Camel"); 
var match = function(){ 
    for(var i = 1; i < result.length; i++){ 
     if(result[i]){ 
      return exp.source.match(new RegExp('(?:[^(]*\\((?!\\?\\:)){' + i + '}([^)]*)'))[1]; 
     } 
    } 
}(); 

// match == caMel 

을 RegExp 엔진을 처음부터 작성하는 것은 매우 쉽지만 (다소 실용적 임에도 불구하고) 기술적으로 기능을 추가 할 수는 있습니다. 전체 엔진이 런타임에 해석되어야하므로 실제 RegExp 객체를 사용하는 것보다 훨씬 느립니다. 그러나 정규 표현식에 대해 표현식의 일치 부분을 정확하게 반환 할 수 있으며 일련의 | OR으로 제한되지는 않습니다.

var matches = { 
    'horse': 'horse', 
    'camel': 'caMel', 
    'tortoise': 'TORTOISe' 
}; 

// Test "Camel" 
matches['Camel'.toLowerCase()]; // "caMel" 
2
:

문제를 해결하는 가장 좋은 방법은, 그러나, 당신은 키에 대한 표준 양식을 사용하여 객체를 생성하는 대신 루프 또는 모든 정규 표현식을 사용하지만,하지 아마

이 반복없이 원하는 값을 제공합니다 :

var foo, pat, tres, res, reg = /horse|caMel|TORTOISe/i; 
foo = reg.exec('Camel'); 

if (foo) { 
    foo = foo[0].replace(/\./g, '\\.'); 
    pat = new RegExp('\\|' + foo + '\\|', 'i'); 
    tres = '|' + reg.source + '|'; 
    res = tres.match(pat)[0].replace(/\|/g, ''); 
} 

alert(res); 

을 일치가없는 경우는 다른 것으로 쉽게 변경할 수 있지만 지금은, undefined를 얻을.

+1

하나의 테스트 케이스에서 작동하지만, "Came"("caME"대신 "CAme"를 반환합니다)과 함께/CAmel | caME | horse/i'와 같이 실패합니다. – Paulpro

+0

@ Paululpro Unfortenately 당신은 이것으로 맞습니다.내가 해결할 수있는 것이 있다면, 나는 대답 할 수 없으면 (또는 할 수 없다면) 나는 점검하고있다. – Teemu

+0

'foo'가 정규 표현식 파싱에서 의미있는 문자를 포함하는보다 복잡한 표현으로 밝혀지면 실패합니다. –