첫 경기에서 멈출 정규 표현식


530

내 정규식 패턴은 다음과 같습니다.

<xxxx location="file path/level1/level2" xxxx some="xxx">

위치에 지정된 따옴표의 부품에만 관심이 있습니다. 탐욕스러운 스위치가 없으면 아래처럼 쉽지 않아야합니까?

/.*location="(.*)".*/

작동하지 않는 것 같습니다.


소스는 무엇입니까, HTML입니까, XML입니까?
Oskar Kjellin

20
왜 이것이 커뮤니티 위키입니까? 진짜 질문입니다. 너무 늦었 어
Ahmad Mageed

1
어떤 언어로 쓰고 있습니까? XML에 정규식을 사용하지 마십시오. XML을 파싱하는 훨씬 더 좋은 방법이 있습니다
Oskar Kjellin

3
당신이 원하는 모든 것이 간단한 속성을 스캔하는 것이 아닙니다. 정규식이 적절하고 빠릅니다.
codenheim

예를 들어 코드 c #을 사용하는 경우 linq를 사용하는 것이 훨씬 좋습니다. 파서가 좋은 경우 정규 표현식을 사용하는 것이 더 나을지 의심됩니다
Oskar Kjellin

답변:


1094

기본적으로 "(.*)"모든 표현식 과 일치 하기 때문에 정규 표현식을 욕심스럽지 않게 만들어야합니다 "file path/level1/level2" xxx some="xxx".

대신, 별표를 욕심없는 것으로 만들면 가능한 한 적은 문자와 일치하게됩니다.

/location="(.*?)"/

?수량 자 ( ?, *또는 +)를 추가하면 욕심이 없습니다.


32
FWIW는 조금 다른 것으로 당신의 VIM을 사용하여,이 정규식의 요구를 넣다 : 대신 .*?그것의 .\{-}비 욕심 경기.
SooDesuNe

44
고마워 다니엘. "수량 자 (?, * 또는 +)에?를 추가하면 욕심이 없습니다." 나에게 유용한 팁입니다.
PhatHV

10
? 이것을 이해하려는 내 혼란을 설명합니다. 적절합니다.
로비 스미스

1
나는 당신이 '욕심없는'대신 '게으른'이라고 말할 수 있다고 생각합니다
Manticore

50

location="(.*)"탐욕스럽지 않은 경우를 제외 location=하고는 "후"부터 "후"까지 일치합니다 some="xxx. 따라서 당신은 필요하거나 .*?(예를 들어 욕심이 없도록) 또는로 대체 .*하는 것이 좋습니다 [^"]*.


3
[^ "] * 또한 대부분의 정규식 엔진에서 더 빠를 것입니다. 현재 패턴 다음에 패턴을 조회 할 필요가 없기 때문입니다.
Jean Vincent

1
@ 킵 : 당신 말이 맞을지 모르지만, .*?표기법이 더 일반적입니다.[^"]*
Bondax

[^ "] *를 사용하여 구분 문자를 포함 시키려면 어떻
습니까?

여기서 ^와 []의 의미를 모르는 경우에는 전혀 없습니다. 대부분의 사람들은 이해합니다. *
빈센트 Gerris

31

어때요?

.*location="([^"]*)".*

이것은. *로 무제한 검색을 피하고 첫 번째 인용 부호와 정확히 일치합니다.


grep불일치 로 인해 이식성이 문제가되는 경우 위의 패턴이 선호되는 패턴이어야합니다.
Josh Habdas

22

엔진에서 지원하는 경우 욕심없는 일치를 사용하십시오. ?를 추가하십시오 캡처 내부.

/location="(.*?)"/

11

?글로벌 플래그가없는 Lazy 한정자 를 사용하는 것이 정답입니다.

예 :

여기에 이미지 설명을 입력하십시오

전역 플래그가 있다면 /g아래처럼 모든 가장 낮은 길이의 일치와 일치했을 것입니다. 여기에 이미지 설명을 입력하십시오


1

당신이 사용하고 있기 때문에 정량화 된 서브 패턴 에 descried로하고 펄 문서 ,

기본적으로, 정량화 된 하위 패턴은 " 욕심 "입니다. 즉 , 패턴의 나머지 부분을 계속 일치시키면서 가능한 한 여러 번 (특정 시작 위치가 지정됨) 일치시킵니다. 당신이 그것을 원하는 경우 시간의 최소 번호와 일치하는 수를의 정량 따라 에 "를?" . 그 의미는 변하지 않고 단지 "만족"이라는 것에 주목하십시오 :

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

따라서 정량화 된 패턴이 최소 일치하도록하려면 다음을 수행하십시오 ?.

/location="(.*?)"/

1

다른 방법이 있습니다.

여기 당신이 원하는 것이 있습니다. 이 게으른[\s\S]*?

첫 번째 항목 : 다음으로 [\s\S]*?(?:location="[^"]*")[\s\S]* 교체 :$1

설명 : https://regex101.com/r/ZcqcUm/2


완전성을 위해 이것은 마지막을 얻습니다. 욕심입니다[\s\S]*

마지막 항목 : 다음으로[\s\S]*(?:location="([^"]*)")[\s\S]* 교체 :$1

설명 : https://regex101.com/r/LXSPDp/3


이 두 정규 표현식 사이에는 단 하나의 차이점이 있습니다. ?

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