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


411

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

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

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

sample
some
another one

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

답변:


766

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

\[(.*?)\]

설명:

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

9
다른 답변의 방법 [^]]은 욕심 ( ?) 보다 빠르며 욕심을 지원하지 않는 정규식 풍미와 함께 작동합니다. 그러나 탐욕스럽지 않은 것이 더 좋아 보입니다.
Ipsquiggle

183
[ ]출력 (결과)에서 제외하는 방법 ?
미키 틴

9
당신이 자바를 사용하는 경우 @MickeyTin는, 당신은 그룹 그것은 '[]'함께 가지 않을 것이다, 그래서 단지 그룹 (이상 그룹 (1))를 사용하여 수
abyteneverlie

21
이것은 첫 번째 사건과 일치합니다
hfatahi

9
반품에서 괄호를 어떻게 제외합니까?
jzadra

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

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

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

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

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

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

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

3
@igaurav 나는 그것을 확인했고 작동합니다. 그러나 Javascript와 같은 룩백을 지원하지 않는 환경에서는 작동하지 않습니다. 아마도 당신의 경우입니까?
Adam Moszczyński

Adam, 문자열에 문자열이 있으면 중첩 된 괄호 솔루션이 실패 .합니다.
patrick

89

이것은 잘 작동합니다 :

\[([^]]+)\]

5
내 유스 케이스에서 대괄호 텍스트에는 줄 바꿈이 포함될 수 있으며이 정규 표현식은 작동하지만 허용되는 답변은 그렇지 않습니다.
Dave

1
문자 클래스 [^]]은 무슨 뜻입니까? 무엇이 일치합니까?
Richard

3
@Richard, ^는 문자 클래스를 무효화합니다. "]가 아닌 모든 문자"를 의미합니다.
jasonbar

8
나는 그것이 예상대로 작동하지 않는다고 생각합니다 \[([^\[\]]*)\]. 내용을 가장 안쪽에 넣는 데 사용해야 합니다. 당신이로 보면 lfjlksd [ded[ee]22]다음 \[([^]]+)\]당신을 얻을 것이다 [ded[ee]제안 된 식을 반환하면서 [ee]. 테스트 링크
TMC

1
이 정규식을 사용하고 텍스트를 추출하기 위해 'sed'및 'awk'예제를 제공 할 수 있습니까? 감사.
발렌티

32

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

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

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

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


@ KunalMukherjee : 아니오, 정규식은 여러 번 일치 할 수 있습니다. 그러나 정규식을 반복적으로 적용하려면 (예를 들어 /gJavaScript 에서 플래그를 사용하여) 일부 정규식 맛을 명시 적으로 알려야 합니다.
Tim Pietzcker

14

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

그것을 분해하자

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

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

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

A(?=B)

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

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

(?<=B)A

대안

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

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

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


12

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

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'"

1
언제 어디서나 정규식에 코드 형식을 사용해야합니다. 정규식이 코드 블록이 아닌 텍스트에있는 경우 백틱을 사용하여 형식을 지정할 수 있습니다. ( ref )
Alan Moore

1
또한 질문은 []괄호가 아닌 대괄호 ( ) 에 관한 것 입니다.
Alan Moore

6

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

\[(([^\]\[]+)|(?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}`);
    });
}

출처

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


4

대괄호 az 사이에 작은 알파벳 문자를 채우려면

(\[[a-z]*\])

작고 대문자를 원한다면 a-zA-Z

(\[[a-zA-Z]*\]) 

작은 대문자와 숫자 a-zA-Z0-9를 원한다면

(\[[a-zA-Z0-9]*\]) 

대괄호 사이에 모든 것을 원한다면

당신이 텍스트, 숫자 및 기호를 원한다면

(\[.*\])

3
([[][a-z \s]+[]])

위의 설명은 다음과 같습니다.

  • 대괄호 안의 문자 []는 문자 클래스를 정의합니다. 즉, 패턴은 대괄호 안에 언급 된 문자 하나 이상과 일치해야합니다.

  • \ s는 공백을 지정합니다

  •  +는 앞에서 언급 한 문자 중 하나 이상을 의미합니다.


민감한 경우 A-Z패턴에 추가해야합니다 ([[][a-zA-Z \s]+[]]). \ 문자열 마크 ( "및 ')로 정의하고"또는'사용법에서 백 슬래시 처리로 초보자를 혼합하는 정규식 패턴에서는 좋은 방법이라고 생각합니다 !
MohaMad

C ++ 정규식에서 나를 위해 일한 유일한 대답 (괄호 대신 따옴표로 묶는 것을 제외하고). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack

3

이 코드는 대괄호와 괄호 사이의 내용을 추출합니다.

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

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets

3

R에서 다음을 시도하십시오.

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

.. 또는 귀하가 제공 한 정규식은 gsub(pat, "\\1", x, perl=TRUE)어디에 있습니까 pat?
Karsten W.

0

줄 바꿈을 포함하고 대괄호를 포함해야했습니다.

\[[\s\S]+\]


0

firstlast 사이의 [ ] 하위 문자열을 일치시키기 위해 사용할 수 있습니다

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

정규식 데모정규식 데모 # 2를 참조하십시오 .

가장 가까운 대괄호 사이에서 문자열을 일치 시키려면 다음 표현식을 사용하십시오 .

  • 괄호 포함 :

    • \[[^][]*]-PCRE , Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]-ECMAScript (자바 스크립트, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] -자바 정규식
    • \[[^\]\[]*\] -Onigmo (루비, 어디서나 괄호를 피해야 함)
  • 괄호 제외 :

    • (?<=\[)[^][]*(?=])-PCRE, Python re/ regex, .NET (C # 등), ICU (R stringr), JGSoft 소프트웨어
    • \[([^][]*)]- 배쉬 , Golang는 - 캡처 아래 참조 또한, 이스케이프 괄호 한 쌍의 대괄호 사이의 내용을
    • \[([^\][]*)]- 자바 스크립트 , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) -자바 정규식
    • (?<=\[)[^\]\[]*(?=\]) -Onigmo (루비, 어디서나 괄호를 피해야 함)

참고 : *0 개 이상의 문자 +와 일치하고 결과 목록 / 배열에서 빈 문자열 일치를 피하려면 1 이상을 일치시키는 데 사용하십시오.

두 가지 둘러보기 지원을 사용할 수있을 때마다 위의 솔루션은 이들을 사용하여 선행 / 트레일 링 열기 / 닫기 브래킷을 제외합니다. 그렇지 않으면 캡처 그룹에 의존합니다 (일부 언어의 가장 일반적인 솔루션에 대한 링크가 제공됨).

중첩 된 괄호 와 일치해야하는 경우 정규식 의 솔루션이 균형 괄호 스레드와 일치 하고 둥근 괄호를 사각형으로 대체하여 필요한 기능을 얻을 수 있습니다. 열기 / 닫기 대괄호를 제외한 내용에 액세스하려면 캡처 그룹을 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.