>백엔드 개발 >PHP 튜토리얼 >정규식의 기본을 배워보세요

정규식의 기본을 배워보세요

韦小宝
韦小宝원래의
2018-03-14 12:52:291394검색

이 글에서는 JavaScript정규식에 대해 설명합니다. JavaScript 정규식에 익숙하지 않은 분들은 그냥 와서 배우셔도 됩니다. 익숙해지셨나요? 살펴보겠습니다!

정규식학습(계속 업데이트)

오늘 javascript을 배우면서 RegExp 객체를 배웠습니다. 저는 정규식을 한번도 접해본 적이 없습니다. 웨이브를 배울 수 있는 기회는 매우 편안합니다.

참조 웹사이트: 정규식 입문 튜토리얼링크를 열려면 클릭하세요

1. 정규식이란 무엇입니까

정규식은 문자열매칭을 표현하는 데 사용되는 규칙입니다.

2. 정규식 관련 개념

2.1메타문자

메타문자는 정규식에 특정 규칙을 대체하기 위해 추가되는 특수 기호입니다.

b 은 단어의 시작이나 끝을 나타냅니다.
. 는 줄바꿈을 제외한 모든 문자를 나타냅니다.
* 는 a*와 같이 * 앞에 나타나는 임의의 수의 문자를 나타냅니다. , 앞에 a(0회 이상 반복)가 있다는 의미입니다.
+ 은 + 앞에 문자가 여러 개 있다는 의미입니다. 예를 들어 , a+는 a 앞에 숫자가 있음을 의미합니다(1회 이상 반복)
n~m회 반복
? 0 또는 1회 반복                                                                                 
{n} n회 반복
{n, } 반복 n회 이상 크거나 같음 {n, m}
D 은 0-9 디지털을 나타냅니다.
W 문자, 숫자, 밑줄 또는 중국어 문자 일치                                                        줄 바꿈, 중국어 전각 공백 등
문자열의 끝과 일치
^ 문자열의 시작과 일치                                    

3. 간단한 정규식

예제에서 직접 시작:

예제 1: hello라는 단어를 일치시키려는 경우 작성된 ​​정규식(일치 규칙)은 다음과 같습니다. hello

이것은 모두 일치합니다. hello가 포함된 단어(예: helloworld도 일치하지만 hello만 일치시키려면 메타 문자 b를 사용하여 hello 앞뒤를 구분하여 별도의 단어 hello를 만들어야 합니다. 는 정규 표현식입니다. 공식은 다음과 같습니다. be: bhellob

예 2: 찾고 있는 hello 뒤에 어떤 문자에서든 월드가 오면 정규 표현식은 bhellob.*worldb

입니다. 3 : 021-xxxxxxx와 같은 전화번호를 일치시키려면 021-ddddddd를 사용해야 합니다. 여기서 "021-"는 특별한 의미를 나타내지 않는 단순 문자이고 나중에 사용되는 d는 메타 문자입니다. . 이 정규 표현식은 021-d{7}로 축약될 수 있습니다. 이는 d가 7번 반복된다는 의미입니다.

예 4: 1개 이상의 연속 숫자 일치, d+

예 5: a로 시작하는 단어 일치, baw*b

예 6: 5~12자리 QQ 숫자 일치, ^d{ 5, 12}&

4. 문자 이스케이프

찾으려는 문자열에 메타 문자가 있는 경우 메타 문자 앞에 추가하여 일반 문자로 변환해야 합니다.

5. 문자 클래스

이 부분에서 해결되는 문제는 일치시키려는 문자에 해당 메타문자가 없는 경우 수동으로 문자 클래스를 만들어야 한다는 것입니다.

예를 들어 숫자 0-9와 일치하는 d가 없는 경우 0-9 사이의 숫자를 찾으려면 [0-9]의 문자 클래스를 만들 수 있습니다. 이는 다음과 정확히 동일한 효과를 갖습니다. 디.

예를 들어 정규 표현식(?0d{2}[), -]?d{8}을 사용하여 전화번호를 일치시킬 수 있습니다. 차례로 설명하세요. (는 이스케이프를 의미합니다(, ?는 0 또는 1을 반복한다는 의미). 시간, d는 두 개의 숫자를 나타내고, [), -]는 ) 및 -, ?의 문자 클래스를 나타냅니다. 는 0회 또는 1회 반복되고 이어서 8개의 숫자가 반복된다는 의미입니다.

6. 분기 조건

위에 적힌 (?0d{2}[), -]?d{8} 정규 표현식은 (01012345678 또는 (010-12345678 등)과 일치할 수 있습니다. 올바른 문자열의 경우 이러한 상황에서는 분기 조건을 사용할 수 있습니다. 분기 조건은 js의 논리 또는 ||와 유사하며 조건이 왼쪽에서 오른쪽으로 판단될 때 종료됩니다. 위 상황에서는 (0d{2})d{8}|0d{2}-d{8}|(0d{2})d{8}

7로 쓸 수 있습니다.

이 부분은 단일 문자가 아닌 여러 문자가 반복되는 문제를 해결하기 위한 것입니다. 단일 문자를 반복할 때 문자+메타 문자에 한정자를 사용할 수 있지만, 반복되는 문자가 여러 개인 경우에는 ()를 추가하면 됩니다. 반복되는 문자 외에도 다음 정규 표현식을 사용하여 IP 주소

(2[0-4]d|25[0-5]|[01]dd?.){ .3}(2[0-4]d|25[0-5]|[01]?dd?)

8. Antonym

xxx 이외의 문자와 같이 쉽게 정의할 수 없는 문자를 찾아야 하는 경우 다음과 같은 모든 문자와 일치하는 antonym

string9 .역참조
W

을 사용해야 합니다. 문자, 숫자, 밑줄 또는 중국어 문자가 아님

D 숫자가 아닌 모든 문자와 일치
B 단어의 시작이나 끝이 아닌 모든 문자와 일치
S 는 공백이 아닌 모든 문자와 일치합니다.
[^x] 는 S+& 이외의 문자와 일치합니다. 공백 문자를 포함하지 않는 문자열과 일치하는 데 사용됩니다.

이 부분은 이전 그룹화와 일치합니다. 문자를 그룹화한 후 나중에 이 그룹화를 ()별로 그룹화하여 참조할 수 있습니다. (가 나타나는 순서대로 1부터 시작합니다. 예를 들어 정규 표현식 b(w+)s+1b를 사용할 수 있습니다. go go 등과 같은 반복 단어를 일치시키기 위해 여기서는 이전에 나타나는 그룹이 1을 통해 참조됩니다. 다른 관련 역참조 구문은 다음과 같습니다:

(exp)

일치 exp.                                                                                     경험치를 일치시키고 현재 내용을 캡처하여 그룹 이름을 그룹 이름으로 지정

(?:exp)

exp 일치, 캡처된 콘텐츠에 그룹 이름을 할당하지 않음

10. 너비가 0인 어설션

은 콘텐츠의 특정 부분 앞이나 뒤에 오지만 해당 콘텐츠를 포함하지 않는 부분을 찾는 데 사용됩니다.

정규식(?=exp)은 나중에 나타나는 부분이 표현식 exp와 일치할 수 있음을 주장하는 것을 의미합니다. 예를 들어 bw+(?=ingb)는 ing으로 끝나는 단어의 앞부분과 일치합니다. 예를 들어 I'm dance and sing 을 검색하면 dance 와 sing 이 일치됩니다(w+가 있으므로 s로 일치하지 않습니다).

정규 표현식(?<=exp)은 이전 부분이 표현식 exp와 일치할 수 있음을 주장하는 것을 의미합니다. 예를 들어 (?<=bre)w+b는 re로 시작하는 단어의 후반부와 일치합니다. 예를 들어 reading을 검색하면 ading이 일치됩니다.

긴 숫자의 세 자리마다 쉼표를 추가하려면(예: 123456789에 쉼표를 추가하려면) 정규식 ((?<=d)d{3})+b를 사용하면 됩니다. , 검색 결과는 234567890 입니다. (검색 규칙 중 이 부분이 이해가 안 되네요...)

다음 예에서는 두 개의 단정문을 동시에 사용합니다 (?=

일반적으로 너비가 0인 어설션의 목적은 특정 규칙에 따라 일치하는 문자의 시작점이나 끝점을 결정하는 것입니다.

11. 너비가 0인 부정 어설션

앞에서 언급한 것처럼 특정 문자가 아니거나 특정 문자 내에 없는 것을 찾으려면 반의어를 사용하세요.

예를 들어 문자 q가 나타나지만 뒤에 u가 없는 단어를 찾으려는 경우입니다. bq[^u]w*b라고 쓸 수도 있습니다. 그러나 그러한 표현의 경우 단어 끝에 q가 나타나면 오류가 발생합니다. 왜냐하면 [^u]는 단어의 구분 기호 문자와 일치하고 그 다음 단어와 일치하며 이라크 전투와 같은 문자와 일치하기 때문입니다. . 끈.

반의어 점유 문제를 해결하기 위해 음수 너비 어설션을 사용할 수 있습니다. 왜냐하면 한 위치에만 일치하고 어떤 문자도 사용하지 않기 때문입니다. 위의 식은 bq(?!u)w*b로 쓸 수 있습니다.

마찬가지로 (?

더 복잡한 예: (?<=<(w+)>).*(?=)

이전 내용 보기(?< =) 그리고 다음 (?=)은 앞과 뒤가 모두 너비가 0인 어설션이고 <(w+)>가 html 태그를 나타낸다는 것을 알 수 있습니다. 어설션은 < ;/h>(이스케이프 및 역참조 사용)을 의미합니다. 따라서 이 정규식은 html 태그 사이의 부분을 일치시키는 것입니다.

12. 댓글

2[0-4]d(?#200-249)와 같은 구문(?#comment)을 통한 댓글을 포함합니다.

13. 탐욕과 게으름

문자열 일치 문제를 처리할 때 일반적인 동작은 가능한 한 많은 문자를 일치시키는 것입니다. a.*b 표현식과 aabab 문자열을 예로 들면 ab 대신 aabab이 일치됩니다. 이 일치 규칙을 탐욕적 일치라고 합니다.

가끔은 가능한 한 적은 수의 문자로 지연 매칭을 해야 하는 경우가 있는데, 이 경우 위에서 언급한 한정자 뒤에 추가해야 합니까? , 예를 들어 a.*?b 는 탐욕적 일치를 지연 일치로 변환합니다. 이때 aab(문자 1-3) 및 ab(문자 4-5)가 일치됩니다(구체적인 이유는 정규 표현식의 일치 규칙과 관련됨). .

14. 처리 옵션

js의 플래그와 유사하게 대소문자 구분, 여러 줄 모드, 전역 모드 등이 있습니다.

15. 균형 있는 그룹/재귀적 매칭

이 부분은 매칭 문제를 다루는 부분입니다. 예를 들어, 수학적 표현에서 (5*3)을 (5*3))) 매칭하고 싶다면, 단순히 (. *)로 쓸 수는 없으며 이는 전체 표현식과 일치합니다. 그러면 채택해야 할 매칭 전략은 우리가 배운 대괄호 매칭 문제와 유사합니다.스택을 사용하여 해결합니다.스택이 터지는 것을 만났을 때 마지막 스택이 비어 있으면 이는 다음을 의미합니다. 표현식의 대괄호가 완전히 일치합니다. 비어 있지 않은 경우 정규식 엔진은 대괄호를 일치시키기 위해 역추적합니다.

관련 권장사항:

JS에서 정규식을 사용하는 방법


위 내용은 정규식의 기본을 배워보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.