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

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

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

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

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

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



답변

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

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

/location="(.*?)"/

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


답변

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


답변

어때요?

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

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


답변

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

/location="(.*?)"/


답변

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

예 :

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

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


답변

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

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

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

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

/location="(.*?)"/


답변

다른 방법이 있습니다.

여기 당신이 원하는 것이 있습니다. 이 게으른[\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


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