[regex] 대괄호 사이에서 텍스트를 추출하는 정규식

간단한 정규식 질문. 다음 형식의 문자열이 있습니다.

this is a [sample] string with [some] special words. [another one]

대괄호 안의 단어를 추출하는 정규식은 무엇입니까?

sample
some
another one

참고 : 사용 사례에서는 대괄호를 중첩 할 수 없습니다.



답변

다음 정규식을 전역 적으로 사용할 수 있습니다 .

\[(.*?)\]

설명:

  • \[: [은 메타 문자이므로 문자 그대로 일치 시키려면 이스케이프해야합니다.
  • (.*?) : 탐욕스럽지 않은 방식으로 모든 것을 일치시키고 포착하십시오.
  • \]: ]은 메타 문자이므로 문자 그대로 일치 시키려면 이스케이프해야합니다.

답변

(?<=\[).+?(?=\])

대괄호없이 내용을 캡처합니다

  • (?<=\[) -긍정적 인 견해 [

  • .*? -콘텐츠에 대한 욕심없는 일치

  • (?=\]) -긍정적 인 전망 ]

편집 : 중첩 된 괄호의 경우 아래 정규식이 작동해야합니다.

(\[(?:\[??[^\[]*?\]))


답변

이것은 잘 작동합니다 :

\[([^]]+)\]


답변

대괄호를 중첩 할 수 있습니까?

그렇지 않은 경우 : \[([^]]+)\]대괄호를 포함하여 하나의 항목과 일치합니다. 역 참조 \1는 일치시킬 항목을 포함합니다. 정규 표현식이 둘러보기를 지원하는 경우

(?<=\[)[^]]+(?=\])

이것은 괄호 안의 항목과 만 일치합니다.


답변

일치하는 대괄호를 포함하지 않으려면 정규 표현식을 사용하십시오. (?<=\[).*?(?=\])

그것을 분해하자

.줄 끝을 제외한 모든 문자와 일치합니다. 는 ?=A는 긍정적 예측 . 긍정적 인 lookahead는 특정 문자열이 뒤에 오면 문자열을 찾습니다. 는 ?<=A는 긍정적 인 lookbehind . 긍정적 인 lookbehind는 특정 문자열이 앞에 오면 문자열을 찾습니다. 인용 ,

미리 긍정적으로 보아라 (? =)

표현식 B가 따르는 표현식 A를 찾으십시오.

A(?=B)

긍정적으로 보아라 (? <=)

표현식 B가 앞에 오는 표현식 A를 찾으십시오.

(?<=B)A

대안

정규식 엔진이 lookaheads 및 lookbehinds를 지원하지 않는 경우 정규식 \[(.*?)\]을 사용하여 그룹에서 괄호의 내부를 캡처 한 다음 필요에 따라 그룹을 조작 할 수 있습니다.

이 정규식은 어떻게 작동합니까?

괄호는 그룹의 문자를 캡처합니다. 은 .*?(당신이하지 않는 한, 줄 끝을 제외하고 괄호 사이의 모든 문자를 얻을 s욕심없는 방식으로 플래그를 활성화).


답변

(?<=\[).*?(?=\])위에 주어진 설명에 따라 잘 작동합니다. 다음은 파이썬 예제입니다.

import re
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\[).*?(?=\])', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"


답변

경우에 따라 대괄호불균형 했을 수 있습니다 .

\[(([^\]\[]+)|(?R))*+\]

물론 사용중인 언어 또는 RegEx 엔진과 관련이 있습니다.

정규식 데모 1


그 이외의,

\[([^\]\[\r\n]*)\]

정규식 데모 2

또는,

(?<=\[)[^\]\[\r\n]*(?=\])

정규식 데모 3

탐색하기 좋은 옵션입니다.


식을 단순화 / 수정 / 탐색하려면 regex101.com의 오른쪽 상단에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 확인할 수도 있습니다.


정규식 회로

jex.im은 정규 표현식을 시각화합니다.

여기에 이미지 설명을 입력하십시오

테스트

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

출처

균형 괄호와 일치하는 정규식