2011-01-20 3 views
2

문자열이 있습니다. Hello {{name}}, how are you doing today? 해당 문자열에서 name을 얻으려고합니다.글로벌 비 캡처 그룹에 대한 RegEx 질문입니다.

지금까지 /\{{2}[a-z0-9]*\}{2}/gi이 있습니다. 문제는, {{name}}이고, 아니라는 것은 name입니다. 글로벌 플래그가 없으면 잘 동작하지만, 이중 대괄호 안에있는 모든 단어의 인스턴스를 얻으려고합니다. 그래서별로 옳지 않습니다 ... 나는 누군가 RegEx 프로이므로 누군가 나를 도울 수 있기를 바라고 있습니다 ...

답변

4

가장 좋은 해결책은 lookaround 어설 션을 사용하는 것이므로 {{}}은 선택되지 않지만 JavaScript 정규 표현식은 lookbehead를 지원하지만 lookahead 만 지원합니다.

/\{{2}([a-z0-9]*)\}{2}/gi 

모든 캡처를 얻으려면, 당신의 정규식으로 RegExp 개체를 만들고, 그 exec() 함수의 결과를 반복 :

그래서 하나 개의 대안은 캡처 그룹에 텍스트를 배치하고 안에 무엇이 잡아하는 것입니다 . 예를 들어 :

jsFiddle sample

또는 검보 그의 코멘트에서 알 수 있듯이

var str = 'Hello {{name}}, how are you doing {{date}}?'; 
var re = /\{{2}([a-z0-9]*)\}{2}/gi; 
var words = []; 
var match; 

while (match = re.exec(str)) { 
    words.push(match[1]); 
} 
수동 일치의 배열에서 {{}}을 제거. 언급 한 바와 같이

+2

그것은 나에게 놀라운했지만, 영업 이익은 말했듯이 때문에 /의 g 플래그, 작동하지 않습니다. 기본적으로 차이는 없습니다. 그것은 javascript가 regexes를 처리하는 방법 때문이라고 생각합니다. perl에서는 잘 작동합니다. –

+0

@crimson_penguin : 모든 캡쳐를 얻기 위해서는'RegExp.exec()'를 반복적으로 실행해야합니다. – BoltClock

+1

@crimson_penguin : 그것은 문제가되지 않습니다 :'matches.map (function (val) {return val.substring (2, val.length-2);})'. – Gumbo

0

참 패턴은 2 개구에 일치 중괄호 개폐가는 방법 (자체 내에 2 수의 연속 괄호가없는 이름을 가정 개방/폐쇄 중)

/\{{2}([a-z0-9]+)*\}{2}/gi

관련 문제