[regex] 구분 기호를 제외하고 두 문자 사이에 포함 된 문자열을 찾기위한 정규식

구분 기호 자체를 반환하지 않고 두 구분 기호 사이에 포함 된 문자 집합을 문자열에서 추출해야합니다.

간단한 예가 도움이 될 것입니다.

대상 : 대괄호 자체를 반환하지 않고 대괄호 사이의 하위 문자열을 추출합니다.

기본 문자열 :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 컬렉션 클래스를 사용합니다 .


답변

[^\[] [가 아닌 문자를 일치시킵니다.

+그렇지 않은 것 중 하나 이상을 일치 [시킵니다. 이러한 일치 그룹을 만듭니다.

(?=\])긍정적 인 예견 ]. ]결과에 포함하지 않고 끝나는 그룹과 일치합니다 .

끝난.

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

증명.

http://regexr.com/3gobr

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'

분명히 다른 답변만큼 효율적이지는 않지만 대안입니다.