2009-09-01 4 views
13

아래의 모든 세 줄은 ARRAY에 2 개의 결과가 반환되어야한다는 것을 이해합니다. 그러나 RegExp는 문자열에서 정규 표현식이 몇 번 반복 되더라도 결과를 1 개만 반환합니다.Javascript Regexp가 전역 결과를 반환하지 않음

이유를 설명 할 수 있습니까? RegExp에서 전 세계적인 결과를 얻을 수있는 방법을 제안하십시오.

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log("New York New York".match(/New York/gi)); 

//OUTPUT: 
["New York", "New York"] 
+0

정말로 흥미 롭 것은 당신이'('뉴욕 뉴욕') .match을 (시도하는 경우/:

는 RegExp.exec 실제로 위치를 기억하고, 후속 호출에 다음 결과를 반환 New York/gi)'그것은 단지 1 개의 결과를 가져올 것이고 (다른 방식으로 필요할 때) [그것을 반복하는 것 외에] (http : // stackoverflow를 제외하고) 나는 더 좋은 방법을 생각할 수 없다. com/questions/42328875/javascript-regex-to-remove-all-numbers-specific-lenght-or-do-a-persistent)! : – cregox

답변

20

세 번째 예제는 일치하는 배열을 가져 오는 가장 좋은 방법입니다.

지금
>>> var v = /new york/gi 
>>> v.exec("NEW YORK new york") 
["NEW YORK"] 
>>> v.exec("NEW YORK new york") 
["new york"] 
>>> v.exec("NEW YORK new york") 
null 
+2

이것을 사용하여 직접 aray를 만들 수도 있지만 string.match를 호출하는 것이 더 쉽습니다. –

+0

문자열에 발생 횟수를 계산하려고하는 키워드 배열이 있습니다. 어떻게 할 수 있니? – StefanHayden

11

예상되는대로 exec()는 단일 일치를 반환하지만 match()보다 일치하는 정보가 더 많습니다. 모든 일치를 원한다면 match()를 사용하십시오. JavaScript: The Definitive Guide에서 : 글로벌 정규식 포함을 통과 할 때

리콜 일치하는() 일치의 배열 을 반환합니다. exec()는 대조를 통해 항상 일치하는 을 하나씩 반환하고 일치하는 내용에 대해 정보를 제공합니다. g 플래그가있는 일반 에크 션에서 exec()가 호출되면 하위 문자열의 lastIndex 속성이 으로 설정됩니다. execle()이 정규 표현식에 대해 두 번째로 호출되면 표현에서 lastIndex 속성으로 표시된 문자 위치가 에서 시작됩니다.

관련 문제