2012-12-21 3 views
2

내가 아주 간단한 코드가 있습니다regex.exec에서 단일 값을 가져 오는 이유는 무엇입니까?

var allTypes = "restaurant|dentist"; 
var typeSplitter = new RegExp("([a-zA-Z]+)"); 
typeSplitter.exec(allTypes); 

내가 원하는를 같은 배열 :

[ "레스토랑", "치과 의사"]

하지만 그 대신 나는이 얻을 :

[ "레스토랑", "레스토랑"]

내 정규식 here을 테스트했습니다. 아마 뭔가 내가 약

답변

9

그냥 할 모르는이 긴에 방법을 조롱했습니다이

allTypes.split('|'); 
// => ['restaurant', 'dentist'] 

.split 또한 정규식 걸릴 수 있습니다; 그것은이 경우

allTypes.split(/[|]/); 

에 필요는 없습니다하지만 당신이 정말로 캡처 정규식을 사용하려는 경우, 당신은 .match

matches = allTypes.match(/([a-zA-Z]+)/g); // g = global modifier 
+0

단지의 경우, 내 정규식 (더 복잡해), 내가 사용 '간부'제대로하고 필요할 수 있습니다? –

+0

@ code-gijoe 아니, 내 대답을 참조하십시오;) –

+3

@ code-gijoe : 정규식은이 간단한 것을위한 큰 클럽입니다. 작동하는 간단한 일을하고, 당신은 더 실질적인 무언가가 필요하면 정규식을 해고하십시오. –

4

exec 때문에 만 반환 한 경기를 모두 캡처를 사용에도 불구하고. 첫 번째 요소는 전체 일치입니다. 두 번째 것은 첫 번째 캡처 (패턴의 첫 번째 괄호 세트)입니다. 전체 패턴을 괄호로 묶었으므로이 값은 일치합니다 (괄호는 필요 없습니다). 대신 match 및 글로벌 수정을 사용하여 더 복잡한 패턴을 가지고 있고 모든 경기를 위해 캡처 그룹을 필요로 할 경우

var result = "restaurant|dentist".match(/[a-zA-Z]+/g); 

는 다음 exec가 갈 수있는 방법입니다. 그러나 당신은 여전히 ​​루프에서 exec을 글로벌 수정을 사용하여 실행해야합니다

var regex = /your(Pattern)here/g; 
var m; 
while (m = regex.exec(input)) 
{ 
    var entireMatch = m[0]; 
    var firstCapture = m[1]; 
    // ... 
    // process results 
} 
+1

에 동의하지 않거나 새 RegExp()를 사용하려면 새 RegExp (패턴 "g")와 함께 전역 한정자를 전달하십시오. – CupawnTae

관련 문제