code

JavaScript Regexp에서 임의의 수의 그룹을 캡처하는 방법은 무엇입니까?

codestyles 2020. 10. 17. 10:34
반응형

JavaScript Regexp에서 임의의 수의 그룹을 캡처하는 방법은 무엇입니까?


이 JavaScript 줄을 기대합니다.

"foo bar baz".match(/^(\s*\w+)+$/)

다음과 같이 반환합니다.

["foo bar baz", "foo", " bar", " baz"]

대신 마지막으로 캡처 된 일치 만 반환합니다.

["foo bar baz", " baz"]

캡처 한 모든 경기를 얻을 수있는 방법이 있습니까?


캡처 그룹을 반복하면 대부분의 플레이버에서 마지막 캡처 만 유지됩니다. 이전 캡처를 덮어 씁니다. .NET과 같은 일부 버전에서는 모든 중간 캡처를 얻을 수 있지만 Javascript에서는 그렇지 않습니다.

즉, Javascript에서 N 캡처 링 그룹 이있는 패턴이있는 경우 해당 그룹 중 일부가 반복 되더라도 일치 당 정확히 N 개의 문자열 만 캡처 할 수 있습니다 .

따라서 일반적으로 수행해야 할 작업에 따라 다음과 같이 말합니다.

  • 옵션 인 경우 대신 구분 기호로 분할
  • 일치하는 대신 루프 에서 /(pattern)+/일치 할 /pattern/g수도 있습니다.exec
    • 이 두 가지는 정확히 동일하지는 않지만 옵션 일 수 있습니다.
  • 다단계 일치 수행 :
    • 한 경기에서 반복되는 그룹 캡처
    • 그런 다음 다른 정규식을 실행하여 해당 일치를 분리하십시오.

참고 문헌


다음 <some;words;here>은 텍스트에서 일치 하고 exec루프를 사용한 다음 분할하여 ;개별 단어를 얻는 예입니다 ( ideone.com 참조 ).

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

사용되는 패턴은 다음과 같습니다.

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

이 경기는 <word>, <word;another>, <word;another;please>, 등의 그룹이 단어의 수를 캡처 반복하지만 마지막 캡처를 유지할 수 있습니다. 전체 단어 목록은 그룹 1에 의해 캡처됩니다. 이 문자열은 split세미콜론 구분 기호에 있습니다.

관련 질문


이건 어때? "foo bar baz".match(/(\w+)+/g)


문자열을 분할하는 방법에 대해 더 복잡한 요구 사항이없는 한, 문자열을 분할 한 다음 초기 문자열을 반환 할 수 있습니다.

var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);

'g'를 사용해보십시오.

"foo bar baz".match(/\w+/g)

참고 URL : https://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp

반응형