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


294

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

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

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

기본 문자열 :This is a test string [more or less]

다음 reg를 사용하면 전의.

\ [. *? \]

경기는 [more or less]입니다. 나는 more or less(괄호없이) 가져와야합니다.

그것을 할 수 있습니까?


답변:


453

쉬운 일 :

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

기술적으로는 미리보기와 미리보기를 사용합니다. Lookahead 및 Look-hind Zero-Width Assertions를 참조하십시오 . 패턴은 다음으로 구성됩니다.

  • 앞에 붙지 않는 [가 뒤 따릅니다 (뒤로).
  • 탐욕스럽지 않은 그룹. 처음에 멈추는 것은 욕심이 아니다]; 과
  • 뒤에 캡처되지 않은]가옵니다 (예측).

또는 대괄호 사이에있는 것을 캡처 할 수 있습니다.

\[(.*?)\]

전체 경기 대신 첫 번째 캡처 그룹을 반환합니다.


138
"쉬운 일", LOL! :) 정규 표현식은 항상 두통을 주며, 문제를 해결하는 것을 찾으면 잊어 버리는 경향이 있습니다. 솔루션 정보 : 첫 번째는 예상대로 작동하고 두 번째는 괄호를 포함하지 않습니다. 저는 C #을 사용하고 있습니다. 아마도 RegEx 객체에 자체 "풍미"정규식 엔진이있을 수 있습니다.
Diego

5
첫 번째 일치 그룹이 아닌 전체 일치를보고 있기 때문에 그렇게하고 있습니다.
cletus

많은 유용한 감사 웹 사이트! 참고로하겠습니다. :) 혼란스러워서 죄송합니다. C # 개발은 실제로 내 기술 중 하나가 아닙니다 ..
Diego

1
하위 문자열에 구분 기호도 포함되어 있으면 작동합니까? 예를 들어 This is a test string [more [or] less]이것이 반환 more [or] less됩니까?
gnzlbg

1
@gnzlbg 아니오, "more [or"를 반환합니다.
MerickOWA

52

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"

2
문자열에 [더 많거나 적은] 일치 항목이 여러 개 있으면 어떻게됩니까?

Lookbehind 어설 션이 ES2018의 RegExp에 추가
TheDarkIn1978

19

대괄호 사이의 비트를 '캡처'하면됩니다.

\[(.*?)\]

캡처하려면 괄호 안에 넣으십시오. 당신은 이것이 어떤 언어를 사용하고 있는지 말하지 않습니다. 예를 들어 Perl에서는 $ 1 변수를 사용하여 여기에 액세스합니다.

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

다른 언어에는 다른 메커니즘이 있습니다. 예를 들어 C #은 Match 컬렉션 클래스를 사용합니다 .


감사하지만이 솔루션은 효과가 없었으며 대괄호를 계속 포함합니다. Cletus의 솔루션에 대한 의견을 썼을 때 C # RegEx 개체가 다르게 해석 할 수 있습니다. 나는 C #에 대해 전문가가 아니기 때문에 추측 일뿐입니다. 아마도 지식이 부족합니다. :)
Diego

11

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

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

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

끝난.

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

증명.

http://regexr.com/3gobr

null에서 제안한 솔루션과 유사합니다. 그러나 추가 \]는 필요하지 않습니다. 추가 참고로, 나타납니다 \을 탈출 할 필요가 없습니다 [애프터 ^. 가독성을 위해 그대로 두겠습니다.

분리 문자가 동일한 상황에서는 작동하지 않습니다. "more or less"예를 들어.


8

PHP :

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);


3

bash 스크립팅과 함께 정규식을 사용하는 것과 동일한 문제가있었습니다. grep -o를 적용한 파이프를 사용하는 2 단계 솔루션을 사용했습니다.

 '\[(.*?)\]'  

우선

'\b.*\b'

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


3

이것은 특히 자바 스크립트의 정규 표현식 파서에서 작동합니다. /[^[\]]+(?=])/g

콘솔에서 이것을 실행하십시오.

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

2

/와 # 사이의 문자열을 찾고 싶었지만 #은 때로는 선택 사항입니다. 내가 사용하는 정규식은 다음과 같습니다.

  (?<=\/)([^#]+)(?=#*)

0

다음은 C #에서 '['및 ']'없이 얻는 방법입니다.

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

출력은 다음과 같습니다.

more or less

-1

대괄호없이 텍스트를 추출 해야하는 경우 bash awk를 사용할 수 있습니다

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

결과:

hola mundo

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