[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="(.*?)"/
답변
답변
당신이 사용하고 있기 때문에 정량화 된 서브 패턴 에 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
이 두 정규 표현식 사이에는 단 하나의 차이점이 있습니다. ?