2016-10-19 4 views
1

정규 표현식에서 그룹 선택자에 대한 모든 연속 일치를 얻으려면 어떻게해야합니까? 모든 일치 (처음뿐 아니라)는 글로벌 플래그 (/ g)를 사용해야 함을 의미하지만 글로벌 플래그를 사용하면 myString.match ( 또는 RegExp.exec (myString)을 통해 결과 배열에서 그룹을 가져올 수 없습니다. 이 두 가지 기능은 글로벌 플래그와 그룹 조합이 처음으로 일치하기 때문에 이러한 상황에서는 쓸모가 없습니다. 예를 들어한 줄의 "preg match all"은 JavaScript의 그룹과 일치합니다.

I는 인쇄 기 A-2기 (B-2)을 MyString = '로렘 입숨 기 A-1기 (B-1) 더미 단순히 텍스트를 그리고 조판 업계 ' 그리고 나는 group-a- * 및 group-b- * 쌍에 대한 모든 현상을보고 싶습니다.


내가 먼저 정규식을 사용하여 그룹과 whoole 부분을 일치시킬 수 있습니다 후 나는 그룹 (들)을 얻기 위해 두 번째 정규식 (그러나 글로벌 플래그를 사용하지 않고)을 사용해야합니다. 중고 myString.match() :

var matchesOne = myString.match(/(group-a-[0-9]) blah (group-b-[0-9])/gi); // ["group-a-1 blah group-b-1", "group-a-2 blah group-b-2"] 
for (var i = 0; i < matchesOne.length; i++) { 
    var matchesTwo = matchesOne[i].match(/(group-a-[0-9]) blah (group-b-[0-9])/i); // note missing global flag here 
    console.log("WHOLE: " + matchesTwo[0] + ";", "GROUP-A: " + matchesTwo[1] + ";", "GROUP-B: " + matchesTwo[2] + ";"); 
} 
// Result: 
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1; 
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2; 

Developer mozilla 사이클 동안 사용하여 유사한 솔루션을 권장합니다. 중고 RegExp.exec (mystring에) :

var matches, myRegExp = /(group-a-[0-9]) blah (group-b-[0-9])/gi; 
while ((matches = myRegExp.exec(myString)) !== null) { 
    console.log("WHOLE: " + matches[0] + ";", "GROUP-A: " + matches[1] + ";", "GROUP-B: " + matches[2] + ";"); 
} 
// Result: 
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1; 
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2; 

두 솔루션 정규식에게주기를 여러 번 실행이 필요합니다. 하지만 나는 PHP에서 preg_match_all()과 같은 쉬운 명령/함수를 사용하고 싶습니다. 가능한가?

답변

2

가장 멋진 해결책은 myString.replace()인데 아무 것도 대체하지 않고 반환 된 값을 무시하지만 쉽게 일치하는 부분과 해당 그룹을 쉽게 얻을 수 있습니다. 데이터는 추상 숫자 인덱스 배열 대신 별도의 변수에 명확하게 저장됩니다.

myString.replace(/(group-a-[0-9]) blah (group-b-[0-9])/gi, function(whole, groupA, groupB) { 
    console.log("WHOLE: " + whole + ";", "GROUP-A: " + groupA + ";", "GROUP-B: " + groupB + ";"); 
}); 
// Result: 
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1; 
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2; 
당신은 결과가
+0

그룹과 다른 대답은 주기적으로 RegExp를 반복해야하는 솔루션을 사용합니다. 이는 하나의 RegExp 만 실행하는 한 줄/한 명령 솔루션에 관한 것입니다. –

+0

stackoverflow.com/a/983827/3832970에서 –

+0

허용 대답은 처리하지 않습니다 http://stackoverflow.com/a/983827/3832970의 속는 사람을 더 나은 보이는 만들기 위해 조각을 사용할 수 있습니다 – mikep

관련 문제