정규식의 경우 검색 구문은 무엇입니까? 좀 좋아 :
Haystack:
The quick red fox jumped over the lazy brown dog
Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z
답변
“검색 할 때까지 검색 X
하지만 포함하지 않음 “을 명시 적으로 표현하는 방법 X
은 다음과 같습니다.
(?:(?!X).)*
어디에 X
어떤 정규 표현식이 될 수 있습니다.
그러나 귀하의 경우 이것은 과잉 일 수 있습니다-여기서 가장 쉬운 방법은
[^z]*
이것은 z
다음을 제외한 모든 것과 일치 하므로 다음 바로 전에 중지 z
됩니다.
그래서 .*?quick[^z]*
일치 The quick fox jumps over the la
합니다.
그러나, 곧 당신이 피려 하나 이상의 간단한 편지를 가지고 (?:(?!X).)*
예를 들어, 활동하기 시작
(?:(?!lazy).)*
-단어의 시작 부분까지 일치합니다 lazy
.
이것은 lookahead assertion , 더 구체적으로 부정적인 lookahead를 사용합니다.
.*?quick(?:(?!lazy).)*
일치 The quick fox jumps over the
합니다.
설명:
(?: # Match the following but do not capture it:
(?!lazy) # (first assert that it's not possible to match "lazy" here
. # then match any character
)* # end of group, zero or more repetitions.
또한 키워드를 검색 할 때 단어 경계 앵커로 키워드를 둘러싸고 싶을 수 있습니다. \bfox\b
는 전체 단어 만 일치 fox
하지만 foxy
.
노트
일치 할 텍스트에 줄 바꿈도 포함될 수있는 경우 정규식 엔진의 “점 모두 일치”옵션을 설정해야합니다. 일반적으로 (?s)
정규식 앞에 추가 하여 이를 달성 할 수 있지만 모든 정규식 엔진 (특히 JavaScript)에서는 작동하지 않습니다.
대체 솔루션 :
대부분의 경우 지연 수량자를 사용하는 더 간단하고 읽기 쉬운 솔루션을 사용할 수도 있습니다. 수량 자에 a ?
를 추가 *
하면 현재 위치에서 가능한 한 적은 수의 문자를 일치 시키려고합니다.
.*?(?=(?:X)|$)
임의의 수의 문자와 일치 X
하며 (정규식이 될 수 있음) 바로 앞 또는 문자열의 끝 ( X
일치하지 않는 경우) 에서 중지 됩니다. 이 작업을 수행하려면 “dot match all”옵션을 설정해야 할 수도 있습니다. (참고 : X
대체에서 안정적으로 격리하기 위해 캡처하지 않는 그룹을 추가했습니다. )
답변
내다 정규식 구문은 당신이 당신의 목표를 달성하는 데 도움이 될 수 있습니다. 따라서 귀하의 예에 대한 정규식은
.*?quick.*?(?=z)
그리고 미리보기 .*?
전에 지연 일치를 확인하는 것이 중요합니다 (?=z)
. 표현식 은 문자 가 처음 나타날 때까지 하위 문자열과 일치합니다 z
.
다음은 C # 코드 샘플입니다.
const string text = "The quick red fox jumped over the lazy brown dogz";
string lazy = new Regex(".*?quick.*?(?=z)").Match(text).Value;
Console.WriteLine(lazy); // The quick red fox jumped over the la
string greedy = new Regex(".*?quick.*(?=z)").Match(text).Value;
Console.WriteLine(greedy); // The quick red fox jumped over the lazy brown dog
답변
이 시도
(.*?quick.*?)z