English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

정규 표현식 무위치 주얼 설명

정규 표현식 비어 있는 락마자:

비어 있는 락마자는 정규 표현식의 어려운 부분이므로, 이 장에서는 매칭 원리 측면에서 중점적으로 분석합니다. 비어 있는 락마자는 다른 이름들도 있습니다. 예를 들어, "환시"나 "예견" 등이 있지만, 이들은 우리의 주요 관심사가 아닙니다.

1. 기본 개념:

비어 있는 락마자는 그 이름처럼 비어 있는 너비의 매칭입니다. 매칭된 내용은 매칭 결과에 저장되지 않으며, 최종 매칭 결과는 단지 위치 하나일 뿐입니다.
작용은 지정된 위치에 제한 조건을 추가하여, 이 위치 이전이나 이후의 문자가 제한 조건을 만족해야만 정규 표현식의 문자 표현식이 매칭 성공할 수 있도록 규정합니다.
주의: 여기서 말하는 서브 표현식은 소괄호로 감싸진 표현식에만 국한되지 않으며, 정규 표현식의 어떤 매칭 요소든지입니다.
javascript는 비어 있는 락마자 전진 주행 주언을 지원하며, 비어 있는 락마자 전진 주행 주언은 직진 비어 있는 락마자 전진 주행 주언과 부정 비어 있는 락마자 전진 주행 주언으로 나눌 수 있습니다.

.부정적 비어 있는 단어 제한:

실제 코드 하나 번째:

코드 예제는 다음과 같습니다:863ab
";/var reg=63;=[A-ab(&#/;
g;

이 코드에서 정규 표현식의 의미는: 대문자가 따라오는 문자열 "ab"를 매칭하는 것입니다. 최종 매칭 결과는 "ab"입니다. 왜냐하면 비어 있는 락마자 "(?=[A-Z])"는 어떤 문자도 매칭하지 않으며, 현재 위치 뒤에 반드시 대문자가 오도록 규정하는 것입니다.

실제 코드 두 번째:

코드 예제는 다음과 같습니다:863ab
";/var reg=63;![A-ab(&#/;
g;

이 코드에서 정규 표현식의 의미는: 문자열 "ab" 뒤에 대문자가 따라오지 않는 문자열을 매칭하는 것입니다. 정규 표현식은 어떤 문자도 매칭하지 못했습니다. 왜냐하면 문자열에서 "ab" 뒤에는 대문자가 따라오기 때문입니다.

이. 일치 원리:

위 코드는 개념적으로 비어 있는 단어 제한이 어떻게 일치하는지 설명하는 것에 불과합니다.
아래에서는 일치 원리를 통해 정적 비어 있는 단어 제한과 부정적 비어 있는 단어 제한이 어떻게 일치하는지 각각 설명합니다.
1.정적 비어 있는 단어 제한:
.부정적 비어 있는 단어 제한:

var str="<div>antzone";
";/^(?=<)<[^>]+>\w+/;
g;

console.log(str.match(reg));
먼저 정규 표현식의 "^"가 제어권을 얻고, 위치에서 일치 시도, 시작 위치를 0으로 일치시키며, 일치 성공 후에 제어권을 "(?=<)"도 비어 있는 것입니다.63;=<)"도 비어 있는 것입니다, "^"는 비어 있는 것입니다, 따라서 "(?=<)"도 0 위치에서 일치 시도하여 일치 성공, 그 위치의 오른쪽은 문자 "<"이어야 하며, 0 위치의 오른쪽은 문자 "<"입니다. 일치 성공 후에 제어권은 "<"에 넘겨지며, "(&#

2;=<)"도 비어 있는 것입니다, 따라서 0 위치에서 일치 시도하여 일치 성공, 이후 일치 과정은 설명하지 않습니다.

.부정적 비어 있는 단어 제한:

코드 예제는 다음과 같습니다:863var str="abZW88ab 
";/var reg=63;![A-ab(&#/Z]) 
g;

console.log(str.match(reg));
일치 과정은 다음과 같습니다:1먼저 정규 표현식의 문자 "a"가 제어권을 얻고, 위치에서 일치 시도, 문자 "a" 일치 성공 후에 제어권을 "b"에 넘겨주고, 위치에서 시작하여 일치 시도63;![A-Z])"에서 시작하여 일치 시도합니다.2위에서 일치 시도, 문자 "b" 일치 성공 후에 제어권을 "(&#"에 넘겨줍니다.1위에서 일치 시도, 그 위치의 오른쪽이 어떤 대문자도 아닐 것을 요구하며, 그 위치의 오른쪽은 대문자 "Z"입니다. 일치 실패 후에 제어권은 다시 문자 "a"에 넘겨지고, 위치에서 시작하여 일치 시도2위에서 시작하여 일치 시도 실패, 그 다음에 제어권을 다시 문자 "a"에 넘겨주고, 위치에서 시작하여 일치 시도7위에서 시작하여 일치 시도 성공, 그 다음에 제어권을 "b"에 넘겨주고, 위치에서 시작하여 일치 시도8위에서 시작하여 일치 시도 성공, 그 다음에 제어권을 "(&#"에 넘깁니다.63;![A-Z])"에서 시작하여 일치 시도합니다.9위에서 시작하여 일치 시도합니다. 그것은 그 위치의 오른쪽이 대문자가 아닐 것을 규정하며, 일치 성공하지만 실제로 문자를 일치시키지는 않습니다. 따라서 최종 일치 결과는 "ab"입니다.

다음은 보충 사항입니다

비어 있는 단어 제한은 정규 표현식의 하나의 방법입니다. 정규 표현식은 컴퓨터 과학에서는 특정 문법 규칙을 준수하는 문자열 시리즈를 설명하거나 일치시키는 단일 문자열을 의미합니다.

정의 및 설명

비어 있는 단어 제한은 정규 표현식의 하나의 방법입니다
정규 표현식은 컴퓨터 과학에서는 특정 문법 규칙을 준수하는 문자열 시리즈를 설명하거나 일치시키는 단일 문자열을 의미합니다. 많은 텍스트 편집기나 다른 도구에서 정규 표현식은 검색과/또는 특정 패턴에 맞는 텍스트 내용을 대체할 수 있습니다. 많은 프로그래밍 언어는 정규 표현식을 이용한 문자열 작업을 지원합니다. 예를 들어, Perl은 강력한 정규 표현식 엔진을 내장하고 있습니다. 정규 표현식은 Unix 도구 소프트웨어(예: sed와 grep)에서 최초로 널리 알려졌습니다. 정규 표현식은 일반적으로 "regex"로 줄여 쓰며, 단수는 "regexp", "regex"로, 복수는 "regexps", "regexes", "regexen"으로 쓰입니다.

무자리 주언어

특정 내용(이 내용을 포함하지 않음) 전후에 있는 것을 찾는 데 사용됩니다. 즉, 이들은 \b, ^, $과 같이 위치를 지정하는 역할을 합니다. 이 위치는 특정 조건(즉, 주언어)을 만족해야 합니다. 따라서 이들은 무자리 주언어라고도 합니다. 예시를 통해 설명하는 것이 가장 좋습니다: 주언어는 특정 사실이 참인 것을 선언하는 데 사용됩니다. 정규 표현식에서는 주언어가 참이 되어야만 매칭이 계속됩니다.

(?=exp)은 무자리 정확한 전후 문장을 말합니다. 자신이 나타난 위치의 뒤에 exp로 매칭되는 것을 주장합니다. 예를 들어, \b(?=re)\w+\b는 re로 시작하는 단어의 뒤 부분(ree를 제외한 부분)을 매칭합니다. 예를 들어, "reading a book."을 찾을 때, "ading"을 매칭합니다.

var reg = new Regex(@"\w+(?=ing)");
var str = "muing";
Console.WriteLine(reg.Match(str).Value);//mu를 반환

(?<=exp)은 무자리 정확한 전후 문장을 말합니다. 자신이 나타난 위치의 앞에 exp로 매칭되는 것을 주장합니다. 예를 들어, \b\w+(?<=ing\b)은 ing으로 끝나는 단어의 앞 부분(ing을 제외한 부분)을 매칭합니다. 예를 들어, "I am reading."을 찾을 때, "read"을 매칭합니다.

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?=\d)\d{3})+\b를 사용하여1234567890을 검색할 때 결과는234567890。
다음 예제는 이 두 가지 주장을 동시에 사용합니다:(?<=\s)\d+(?=\s)는 공백 문자로 구분된 숫자를 매칭하며(다시 강조하지만,이 공백 문자는 포함하지 않습니다).

부정 전개된 무자리 주언어

이전에 언급했던 방법(반의)을 통해 특정 문자나 특정 문자 클래스에 속하지 않는 문자를 찾는 방법에 대해 언급했습니다. 하지만 특정 문자가 나타나지 않는다고 확인하고자만, 그 문자를 매칭하고자 않을 때는 어떻게 해야 하나요? 예를 들어, 다음과 같은 단어를 찾고자 할 때--그 안에 글자 q가 나타났지만 q 뒤에는 글자 u가 따르지 않기 때문에, 이렇게 시도해 보세요:

\b\w*q[^u]\w*\b는 q가 단어의 끝에 나타나지 않는 단어를 매칭합니다. 하지만 더 많은 테스트를 해보거나, 생각이 매우 뛰어나면 바로 알아챌 수 있을 것입니다. 예를 들어, q가 단어의 끝에 나타나면 Iraq, Benq와 같이 이 표현은 오류를 발생시킵니다. 왜냐하면 [^u]는 항상 하나의 문자를 매칭해야 하기 때문입니다. 따라서 q가 단어의 마지막 문자인 경우, 그 다음 [^u]는 q 뒤의 단어 구분자(공백, 마침표나 다른 것)를 매칭하게 됩니다. 그 다음의 \w*\b은 다음 단어를 매칭할 것입니다, 따라서 \b\w*q[^u]\w*이렇게 "Iraq fighting" 전체를 매칭할 수 있습니다. 부정 전개된 무자리 주언어는 이러한 문제를 해결할 수 있습니다. 왜냐하면 그것은 단 하나의 위치에 매칭하며 어떤 문자도 소비하지 않기 때문입니다. 지금, 이렇게 문제를 해결할 수 있습니다: \b\w*q(?!u)\w*\b。

무너진 길어진 전후 문장에서 자신의 위치 뒤에 일치하는 표현식 exp를 주장하지 않는다(?!exp)은 자신의 위치 뒤에 일치하는 표현식 exp를 주장하지 않습니다. 예를 들어:\d{3})(?!\d)은 세 자리 숫자를 일치시킵니다. 그리고 이 세 자리 숫자 뒤에는 숫자가 없습니다;\b((?!abc)\w)+\b가 연속된 문자열 abc를 포함하지 않는 단어를 일치시킵니다.
그리고(?<!exp)은 무너진 길어진 전후 문장에서 자신의 위치 앞에 일치하는 표현식 exp를 주장하지 않는다:(?<![a-z])\d{7}이전에 소문자가 아닌 일곱 자리 숫자를 일치시킵니다.

더 복잡한 예제:(?<=<(\w+)>).*(?=<\/\1>)은 속성을 포함하지 않는 간단한 HTML 태그 내부의 내용을 일치시킵니다. (<?=(\w+)>)와 같은 접두사를 지정합니다: 꼬리표로 둘러싸인 단어(예를 들어 <b>일 수 있습니다), 그 다음은.*(상대적으로 무엇인가의 문자열), 마지막에는 후缀(?=<\/\1>). 주의해야 할 것은 후缀에 있는\/를 사용한 문자 인코딩을 사용합니다;\1은 역방향 참조로, 첫 번째로 잡힌 그룹을 참조합니다. 앞의(\w+)내용을 일치시킵니다. 따라서 접두사가 실제로 <b>인 경우, 접미사는 </b>로 전환됩니다. 전체 표현식은 <b>와 </b>사이의 내용(다시 말해, 접두사와 접미사 자체는 포함되지 않습니다).

위의 것을 보면 어려워 보일 수 있습니다. 추가로 설명해 보겠습니다.

주장은 일정한 사실을 선언하는 데 사용됩니다. 정규 표현식에서 주장이 참이 되면 일치가 계속됩니다.
다음 네 가지는 특정 내용(이 내용을 포함하지 않습니다) 전후에 있는 것을 찾는 데 사용됩니다. 즉, 이들은 \b,^,$와 같이 위치를 지정하는 데 사용되며, 이 위치는 특정 조건(즉, 주장)을 만족해야 합니다. 따라서 이들은 무너진 길어진 전후 문장에서도 사용됩니다. 예를 들어:

(?=exp)도 무너진 길어진 전후 문장에서 자신의 위치 뒤에 일치하는 표현식 exp를 주장합니다. 예를 들어\b\w+(?=ing\b),ing으로 끝나는 단어의 앞부분(ing을 제외한 부분)을 일치시킵니다. 예를 들어 I'm singing while you're dancing.을 찾을 때, sing과 danc을 일치시킵니다.
(?<=exp)도 무너진 길어진 전후 문장에서 자신의 위치 앞에 일치하는 표현식 exp를 주장합니다. 예를 들어(?<=\bre)\w+re로 시작하는 단어의 후반부를 일치시킵니다(예를 들어 re는 제외됩니다). 예를 들어 reading a book을 찾을 때, ading을 일치시킵니다.

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b를 사용하여1234567890을 검색할 때 결과는234567890。
다음 예제는 이 두 가지 주장을 동시에 사용합니다:(?<=\s)\d+(?=\s)는 공백 문자로 구분된 숫자를 매칭하며(다시 강조하지만,이 공백 문자는 포함하지 않습니다).

충실 2:

최근 HTML 파일을 소스 코드 처리하기 위해 정규 표현식을 찾고 대체해야 했습니다. 이 기회를 타고 정규 표현식을 체계적으로 배웠습니다. 하지만 이전에는 정규 표현식을 사용했지만, 항상 일시적으로 배웠고 넘어갔습니다. 배우는 과정에서 여러 가지 문제를 만났습니다. 특히 빈도 정규 표현식 예측先行断言(여기서는 또 한 번 토로하겠습니다. 인터넷에는 모두 복사/黏贴된 내용이 많습니다. 문제를 겪으면 여러 가지 중복된 내용을 확인했습니다. 실망스럽습니다!!!),따라서 이곳에서 이해한 내용을 적어 두고, 앞으로 참고하기 위해 기록했습니다!

      빈도 정규 표현식 전진 예측先行断言이 무엇인지 MSDN 공식 설명을 보세요

(?= 자식 표현)

(빈도 정규 표현식 전진 예측先行断言。)자식 표현이 이 위치의 오른쪽에서 매칭되면 다음으로 매칭합니다. 예를 들어, \w+(?=\d)과 숫자 뒤의 단어를 매칭하며, 숫자와는 매칭하지 않습니다.

      유명한 예제: 단어가 ing으로 끝나면, ing 앞의 내용을 가져오려고 합니다

var reg = new Regex(@"\w+(?=ing)");
var str = "muing";
Console.WriteLine(reg.Match(str).Value);//mu를 반환

      이제 어디서든 볼 수 있는 예제들이었습니다. 여기서까지 이해했으리라 생각합니다. 실제로는 exp 표현 앞의 내용을 반환한 것입니다.

     아래의 코드를 보세요

var reg = new Regex(@"a(?=b)c");
var str = "abc";
Console.WriteLine(reg.IsMatch(str));//false를 반환

      왜 false를 반환하나요?

     사실 MSDN 공식 정의는 이미 말했습니다. 하지만 그것은 매우 공식적인 표현이었습니다. 이곳에서 우리가 주의해야 할 중요한 점이 있습니다: 이 위치. 맞습니다, 위치가 아니라 문자입니다. 따라서 공식 정의와 첫 번째 예제를 결합하여 두 번째 예제를 이해해야 합니다:

     a의 뒤가 b라면, 이 때 매칭 내용 a(첫 번째 예제에서 알 수 있듯이, exp 매칭 내용을 반환하지 않고 a만 반환합니다), 이 때 a(?=b)c에서 a(?부분은 이미 해결되었습니다. 다음으로 해결해야 할 c의 매칭 문제를 해결해야 합니다. 이 때 매칭 c는 문자열 abc에서 어디서 시작해야 할까요? 공식 정의와 결합하여 알 수 있습니다. 즉, 자식 표현의 위치에서 오른쪽으로 시작하는 것이며, 따라서 b의 위치에서 시작합니다. 그러나 b는 a(?=b)c의 나머지 부분의 c를 매칭하면 abc는 a(&#을 매칭하지 않습니다.63;=b)c를 마치고.

     그런 다음, 위와 같은 매칭을 수행하려면 정규 표현식은 어떻게 작성해야 하나요?

     답은: a(?=b)bc

     물론, 누군가는 abc를 직접 매칭하면 되지 않느냐고 말할 수 있습니다. 물론 필요가 없습니다. 그럴 이유는 zero width positive lookahead assertion이 정확하게 무엇인지 설명하기 위해서입니다. 다른 zero width assertion도 동일한 원리입니다!

충전 3

(?=exp): 이 위치의 뒤에 exp 표현식을 매칭할 수 있는 null width positive lookahead assertion

#_path 이후에 일치하고 결과가 product인 것을 매칭
  'product_path'.scan /(product)(?=_path)/

(?<=exp): 이 위치의 앞에 exp 표현식을 매칭할 수 있는 null width positive lookbehind assertion

#name: 이전에 일치하고 결과가 wangfei인 것을 매칭
'name:wangfei'.scan /(?<=name:)(wangfei)/ #wangfei

(?!exp): 이 위치의 뒤에 exp 표현식을 매칭하지 못하는 null width negative lookahead assertion

#_path 이후에 일치하지 않는 것을 매칭
'product_path'.scan /(product)(?!_path)/  #nil
#_url 이후에 일치하지 않는 것을 매칭
'product_path'.scan /(product)(?!_url)/  #product

(?<!exp): 이 위치의 앞에 exp 표현식을 매칭하지 못하는 null width negative lookbehind assertion

#name: 이전에 일치하지 않는 것을 매칭
'name:angelica'.scan /(?<!name:)(angelica)/  #nil
#nick_name: 이전에 일치하지 않는 것을 매칭
'name:angelica'.scan /(?<!nick_name:)(angelica)/#angelica

편집자도 이거 너무 싫어서, 좋은 걸 나누기 전까지 기다리세요, 오늘은 씻고 잠들어요

추천해드립니다