2014-03-03 3 views
0

정규 표현식을 배우고 있습니다 (현재 Javascript에 있음). 정규 표현식 캡쳐 그룹

내가 어떤 길이의 직선 문자열이 있습니다

내 질문이다.

이 문자열에는 최소한 (필수) 세 패턴이 있습니다.

결과로 rule.exec() 문자열을 원하고 3 요소 배열을 얻으려고합니다. 각 패턴을 별도의 요소로.

어떻게 접근해야합니까? 현재 나는 그것에 도달했지만 많은 위아래로 캡처를 그룹화하기 위해 정확히 무엇을해야하는지 모릅니다. 정규 표현식의 각 그룹을 구분하는 괄호 ()입니까?

내 정규 표현식 규칙 예 :

var rule = /([a-zA-Z0-9].*\s?(@classs?)+\s+[a-zA-Z0-9][^><]*)/g; 
var str = "<Home @class www.tarjom.ir><string2 stringValue2>"; 
var res; 
var keys = []; 
var values = []; 
while((res = rule.exec(str)) != null) 
{ 
    values.push(res[0]); 
} 
console.log(values); 

// begin to slice them 
var sliced = []; 
for(item in values) 
{ 
    sliced.push(values[item].split(" "));// converting each item into an array and the assign them to a super array 
} 



/// Last Updated on 7th of Esfand 
console.log(sliced); 

그리고 (파이어 폭스 27 - 개똥 벌레의 CONSOLE.LOG) 반환 결과는

[["Home", "@class", "www.tarjom.ir"]] 

내가 필요한 것을 가지고, 난 그냥 설명이 필요 반환 패턴에.

답변

3

예, parentheses capture everything between them. 캡처 된 그룹은 여는 괄호로 번호가 매겨집니다. 따라서 /(foo)((bar)baz)/이 일치하면 첫 번째 캡처 된 그룹에 foo, 두 번째 barbaz 및 세 번째 bar이 포함됩니다. 일부 방언에서는 처음 9 개의 캡처 그룹 만 번호가 매겨집니다.

캡처 된 그룹은 backreferencing으로 사용할 수 있습니다. "foobarfoo"와 일치 시키려면 /(foo)bar\1/이 수행 할 것입니다. 여기서 \1은 "내가 처음 캡처 한 그룹"을 의미합니다.

그룹화를 위해 괄호가 필요한 경우 캡처를 피할 수있는 방법이 있습니다. 예를 들어, "foo"또는 "foobar"와 일치 시키려면 /(foo(bar)?)/을 사용하지만 두 번째 그룹에서는 "bar"를 캡처했을 수 있습니다. 이것을 피하려면 /(foo(?:bar)?)/을 사용하여 "foo"또는 "foobar"중 하나만 캡처하십시오.


이유는 your code은 다른 값으로 표시됩니다. 먼저, 당신은 성냥을합니다. 그런 다음, 첫 번째 캡처를 한 공간에서 분할합니다. 은 결과 배열에 넣은 것입니다. 한 번에 배열을 밀어 넣으므로 배열 배열로 끝납니다. 따라서 이중 괄호.

귀하의 정규식 일치 (우리는 펄의 확장 가독성 모드에있어 척) :

/     # matching starts 
    (    # open 1st capturing group 
    [a-zA-Z0-9]  # match 1 character that's in a-z, A-Z, or 0-9 
    .*    # match as much of any character possible 
    \s?    # optionally match a white space (this will generally never happen, since the .* before it will have gobbled it up) 
    (    # open 2nd capturing group 
     @classs?  # match '@class' or '@classs' 
    )+    # close 2n group, matching it once or more 
    \s+    # match one or more white space characters 
    [a-zA-Z0-9]  # match 1 character that's in a-z, A-Z, or 0-9 
    [^><]*   # match any number of characters that's not an angle bracket 
)     # close 1st capturing group 
/g     # modifiers - g: match globally (repeatedly match throughout entire input) 
+0

을 나는 괄호 3 개 세트가있는 경우'()()()'나는 세 캡처 그룹을받을 수 있습니까? –

+0

@ MT-Developer 예, 업데이트 된 답변을 참조하십시오. – SQB