2011-10-21 2 views
2

내 질문을 주셔서 감사합니다.정규 표현식 대체 (모든 일치)

var re = new RegExp('o1|o2|o3|o4|o5|...','g')

문제 내가 O1는 O2의 하위 문자열 인 경우 일 것입니다으로 실행

은 내가 정규식에 일치하도록 노력하고 대안의 긴 목록을 가지고있다. 예를 들어

var re = new RegExp('a|b|c|ab|abc','g')

var s = 'abc'

s.match(re) -> [ "A", "B", "C"]

또한 "AB와 일치 할 수 있도록하기위한 내가 좋아하는 것

"및"abc ". RegExp의 순서를 변경하면 긴 문자열과 일치시킬 수 있지만 실제로 모든 일치 항목을 가져 오려고합니다.

가장 좋은 방법은 무엇입니까? 이것은 반드시 긴 대안 목록을 다루는 최선의 (또는 좋은 방법) 것처럼 보이지 않습니다. 나는 각 대안을 그것의 자신의 정규 표현식으로 테스트하는 것을 생각했지만, 그것은 덜 효율적으로 보였다.

모든 안내가 훌륭합니다. 감사!

+0

그래서 당신은 모든 가능한 일치를 원하는을 이 대안들? 나는 그것이 표현으로 만 가능하다고 생각하지 않는다. –

+0

네, 그게 내가 원하는 것입니다. 과거에는 중복되지 않는 옵션 목록을 가지고 있었고 자체 regexp에서 각 옵션을 확인하거나 indexOf를 사용하는 것보다 빠르다고 보였습니다. 대체물의 중복 가능성 때문에리스트를 반복 할 필요가 있다고 생각합니다. -/ – bobjenkins1234

답변

1

RegExp에 길다란 대안 목록이있는 경우 더 나은 방법은 StringindexOf 방법을 사용하는 것입니다. 당신이 "abc" 같은 전체 문자열과 일치하려고하면

var alternatives = ['a', 'b', 'c', 'ab', 'abc'], 
    s = 'abc, cba', 
    i, 
    index; 

for (i = 0; i < alternatives.length; i++) { 
    index = -1; 
    do { 
     index = s.indexOf(alternatives[i], index+1); 
     if (index !== -1) { 
      console.log(alternatives[i], index); 
     } 
    } while (index !== -1); 
} 
+0

그래서 각 대안에 대해'indexOf'를 실행하고 일치 항목을 추적합니까? – bobjenkins1234

+0

@ bobjenkins1234 코드가 추가되었습니다. – bjornd

+0

indexOf가 voigtan

0

는 다음 Rgex은 다음과 같습니다 : 다음은 문자열에있는 모든 대안의 인덱스 출력 코드

^(a|b|c|ab|abc)$ 

는하지만 어쩌면 쉽게있다 방법을 찾지 만, 당신을 돕기 위해, 나는 당신이 확인하고 싶은 모든 "대안"을 알아야합니다. 어쩌면 짧은 정규 표현식이 가능할 수도 있습니다.

0

당신은 설정 여러 (capturing groups) 모든 경기를 얻을 수 ... 당신은 아직도 당신의 예를 사용하여 대안 따라

을 주문해야 수 :

var re = /((a)(b))(c)|(a)(b)|a|b|c/ 
var s5 = 'abc'; 
var s4 = 'ab'; 
var s3 = 'a'; 
var s2 = 'b'; 
var s1 = 'c'; 

console.log(s5.match(re)); // ['abc', 'ab', 'a', 'b', 'c', undef, undef] 
console.log(s4.match(re)); // ['ab', undef, undef, undef, undef, 'a', 'b'] 
console.log(s3.match(re)); // ['a', ... undef x 6 ...] 
console.log(s2.match(re)); // ['b', ... undef x 6 ...] 
console.log(s1.match(re)); // ['c', ... undef x 6 ...] 

More info on capturing groups