2014-12-04 1 views
1

이것이 버그인지 또는 단순히 자바 스크립트 정규식 메서드의 동작을 이해하지 못하는지 확실하지 않습니다.javascript regex match/exec issue

문제는 정규 표현식 없이는 match/exec 메서드로 작업 할 때/(something | something) 형식의 regexp를 얻을 수 없다는 것입니다./(somereg1 | somereg2)/g

전역 식별자가 있으면 메소드는 찾은 모든 인스턴스를 올바르게 반환합니다. 그러나 거기에 없으면 두 방법 모두 올바르게 첫 번째 일치 항목 만 반환합니다. 문제는 두 번 돌려주는 것입니다. 문장의 예를 들면 : http://jsfiddle.net/myf43ay1/

코드는 상당히 자기 설명해야한다 :

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(somereg1|somereg2)/) 

는 이 대신은 "somereg1, somereg1"

확인이 jsfiddle를 반환 "somereg1"를 반환합니다. 첫 번째 예는 W3 학교에서 취해진 것입니다.

질문 사항이 있으면 알려 주시기 바랍니다.

\ Peter

+0

첫 번째 요소는 정규식에 의해 완전 일치. 두 번째 요소는 캡쳐 된 모든 그룹을 얻습니다. – anubhava

답변

1

첫 번째 요소는 정규식의 전체 일치입니다. 시도한 경우 :

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/.*(somereg1|somereg2)/) 

결과는 ["Here is somereg1 and somereg2", "somereg2"]입니다.

동일한 문제가 .exec(str) 메서드에서 발생합니다.

.match.exec에 대해 읽어보세요.

편집 : "하위 괄호 macthes"에 대해서는 정규식에서 괄호로 capture groups으로 구분됩니다.

/.*(somereg1).*?(somereg2)/ 

귀하의 .match 결과가 ["Here is somereg1 and somereg2", "somereg1", "somereg2"] 것 : 그래서, 만약 당신이 정규식을했다. 결과 배열은 전체 일치와 모든 일치하는 캡처 그룹으로 구성됩니다.

는 그리고하지 캡처 할 그룹을 강제로 단지 (?:)으로 구분 :

"Here is somereg1 and somereg2".match(/.*(?:somereg1).*?(somereg2)/); 
// Will result in ["Here is somereg1 and somereg2", "somereg2"] 

참고 : 자바 스크립트에서이 캡처 그룹이 글로벌 (/g) 정규 표현식에 작동하지 않습니다.

+0

링크가 멋집니다! 나는 왜 그들이 지금 이런 식으로 행동하는지 이해한다. sub.parentheses 일치를 반환하는 이유는 무엇입니까? – PNS

+0

내 대답을 편집했습니다. –

+0

이제는 의미가 있습니다. 이 소그룹을 포함시키지 않는 방법을 아는 것도 좋았습니다. – PNS

0

다음을 사용하여 req를 얻을 수 있습니다. 결과 :

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(?=(somereg1|somereg2))/) 

일치 항목과 실행 항목은 다음과 같습니다. 내가 정규식 개체를 사용하고 다시 이스케이프와 모두로 사용되는 문자열에 대한 당신을 방지 일치로 이동 말할 것입니다.

1

는 다음과 같이 두 번째 줄을 수정 : 일치하는 배열의

str.match(/somereg1|somereg2/) 
+0

검색 결과 Array [ "somereg1"] –

+0

Madhura 그게 실제로 내가 찾고있는 것입니다! 그러나 내가 왜 Danilo의 대답 때문에인지 이해하는 유일한 이유가 있습니다. 하지만 덕분에 이걸 사용할 것입니다. – PNS