구분 기호 자체를 반환하지 않고 두 구분 기호 사이에 포함 된 문자 집합을 문자열에서 추출해야합니다.
간단한 예가 도움이 될 것입니다.
대상 : 대괄호 자체를 반환하지 않고 대괄호 사이의 하위 문자열을 추출합니다.
기본 문자열 :This is a test string [more or less]
다음 reg를 사용하면 전의.
\ [. *? \]
경기는 [more or less]
입니다. 나는 more or less
(괄호없이) 가져와야합니다.
그것을 할 수 있습니까?
답변
쉬운 일 :
(?<=\[)(.*?)(?=\])
기술적으로는 미리보기와 미리보기를 사용합니다. Lookahead 및 Look-hind Zero-Width Assertions를 참조하십시오 . 패턴은 다음으로 구성됩니다.
- 앞에 붙지 않는 [가 뒤 따릅니다 (뒤로).
- 탐욕스럽지 않은 그룹. 처음에 멈추는 것은 욕심이 아니다]; 과
- 뒤에 캡처되지 않은]가옵니다 (예측).
또는 대괄호 사이에있는 것을 캡처 할 수 있습니다.
\[(.*?)\]
전체 경기 대신 첫 번째 캡처 그룹을 반환합니다.
답변
JavaScript 를 사용하는 경우 JavaScript가 lookbehind 연산자를 지원하지 않기 때문에 cletus에서 제공 하는 첫 번째 솔루션(?<=\[)(.*?)(?=\])
이 작동하지 않습니다.
그러나 두 번째 솔루션은 잘 작동하지만 두 번째 일치 요소를 가져와야합니다.
예:
var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);
다음을 반환합니다 :
["[more or less]", "more or less"]
따라서 두 번째 가치가 필요합니다. 사용하다:
var matched = regex.exec(strToMatch)[1];
돌려 주다:
"more or less"
답변
대괄호 사이의 비트를 ‘캡처’하면됩니다.
\[(.*?)\]
캡처하려면 괄호 안에 넣으십시오. 당신은 이것이 어떤 언어를 사용하고 있는지 말하지 않습니다. 예를 들어 Perl에서는 $ 1 변수를 사용하여 여기에 액세스합니다.
my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";
다른 언어에는 다른 메커니즘이 있습니다. 예를 들어 C #은 Match 컬렉션 클래스를 사용합니다 .
답변
[^\[]
[가 아닌 문자를 일치시킵니다.
+
그렇지 않은 것 중 하나 이상을 일치 [
시킵니다. 이러한 일치 그룹을 만듭니다.
(?=\])
긍정적 인 예견 ]
. ]
결과에 포함하지 않고 끝나는 그룹과 일치합니다 .
끝난.
[^\[]+(?=\])
증명.
null에서 제안한 솔루션과 유사합니다. 그러나 추가 \]
는 필요하지 않습니다. 추가 참고로, 나타납니다 \
을 탈출 할 필요가 없습니다 [
애프터 ^
. 가독성을 위해 그대로 두겠습니다.
분리 문자가 동일한 상황에서는 작동하지 않습니다. "more or less"
예를 들어.
답변
PHP :
$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
답변
[]도 제거하려면 다음을 사용하십시오.
\[.+\]
답변
bash 스크립팅과 함께 정규식을 사용하는 것과 동일한 문제가있었습니다. grep -o를 적용한 파이프를 사용하는 2 단계 솔루션을 사용했습니다.
'\[(.*?)\]'
우선
'\b.*\b'
분명히 다른 답변만큼 효율적이지는 않지만 대안입니다.