간단한 정규식 질문. 다음 형식의 문자열이 있습니다.
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}`);
});
}