정규식 메타 문자 및 일치 ...LOGIN

정규식 메타 문자 및 일치 규칙

메타문자

메타문자 ~                                                     회 또는 선행 문자 수 <<> + 앞의 문자 이상과 일치하는 것이 더 표준적인 접근 방식은 포인트를 원자로 계산하는 것입니다. n

|                   또는을 제외한 모든 문자와 일치합니다. 참고: 우선순위가 가장 낮습니다.

^                                                                                                        > B 비경계
<{> {m}이(가) 있고

{n, m}만 나타날 수 있습니다.

() 우선순위를 변경하거나 문자열을 전체적으로 처리할 수도 있습니다.

+ 이전 문자를 한 번 이상 일치시키세요

<?php
$zz = '/\d+/';
$string = "迪奥和奥迪250都是我最爱";
//待会儿再试试中间没有0-9的情况
//$string = "迪奥和奥迪都是我最爱";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

성공적으로 일치하여 d+에서 +가 입증되었습니다. d는 숫자와 일치하고 +는 이전 문자와 적어도 한 번 일치합니다.

* 0 또는 선행 문자와 일치

<?php
$zz = '/\w*/';
$string = "!@!@!!@#@!$@#!";
//待会儿再试试中间没有0-9的情况
//$string1 = "!@#!@#!abcABC#@#!";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

는 주석 처리된 $string1과 $string이 성공적으로 일치했음을 보여줍니다. 왜냐하면 w는 0-9A-Za-z_와 일치하고, *는 이전 w가 존재하지 않음을 의미하기 때문입니다. 존재하는 경우 1개 이상이 있을 수 있습니다.

? 이전 문자가 0번 또는 1번 나타납니다. 선택 사항인

<?php
$zz = '/ABC\d?ABC/';
$string = "ABC1ABC";
//待会儿再试试中间没有0-9的情况
//$string1 = "ABC888888ABC";
//$string2 = "ABCABC";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

는 $string, $string2와 성공적으로 일치하지만 $string1과 일치하지 않습니다.
매칭 전후에 ABC가 있고 중간에 0~9가 있기 때문에 0~9는 선택사항이지만 2개 이상 있을 수 없습니다.

.(점) n을 제외한 모든 문자와 일치합니다.

<?php
$zz = '/gg.+gg/';
$string = "ABC1ABC";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

는 $string과 일치하고, $string2는 성공하지만 $string1과 일치하지 않습니다.
매칭 전후에 ABC가 있고 중간에 0~9가 있기 때문에 0~9는 선택사항이지만 2개 이상 있을 수 없습니다.

|(세로 막대) 또는 가장 낮은 우선순위

우선순위 및 또는

<?php
$zz = '/abc|bcd/';
$string1 = "abccd";
$string2 = "ggggbcd";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

의 일치를 실험을 통해 살펴보겠습니다.

1. 처음에는 매칭에 대한 생각이 abccd 아니면 abbcd였어요. 그러나 $string1과 $string2가 일치하는 경우 일치하는 결과는 abc 및 bcd입니다.

2. 구현 또는 일치하는 경우 일치하는 결과는 abc 또는 bcd입니다. 함께 연속된 문자열보다 우선순위가 높지 않습니다.

그러면 위의 예에서 abccd나 abbcd를 일치시키려면 어떻게 해야 합니까?

우선순위를 변경하려면 ()를 사용해야 합니다.

<?php
$zz = '/ab(c|b)cd/';
$string1 = "起来abccd阅兵";
$string2 = "ggggbcd";
$string3 = '中国abbcd未来';
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

결과는 다음과 같습니다.

이 일치하고 결과는 다음과 같습니다.

배열(크기=2)

0 => 문자열 'abccd'(길이 = 5)

1 => 문자열 'c'(길이 = 1)

결론:

1) abccd 또는 abbcd($string1 또는 $string3)와 일치합니다.

2) 하지만 일치하는 배열에 요소가 하나 더 있고 이 요소의 첨자는 1입니다.

3) ()의 내용이 성공적으로 일치하는 한 일치된 데이터는 인덱스 1을 가진 이 배열 요소에 배치됩니다.

^(circumflex), ^

<?php
$zz = '/^好帅\w+/';
$string1 = "好帅abccdaaaasds";
//$string2没有以好帅开始
$string2 = "帅abccdaaaasds";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

뒤의 문자열로 시작해야 합니다. 실험을 통해 다음과 같은 결론을 얻었습니다.

1) $string1 The 일치는 성공했지만 $string2는 일치하지 않습니다

2) $string1은 지정된 문자

3)로 시작하고 $string2는 ^

<🎜 다음 문자로 시작하지 않기 때문입니다. >이 정규 번역의 의미는 다음과 같습니다. "be so handsome"으로 시작하고 그 뒤에 최소한 하나의 문자 a-zA-Z0-9_가 옵니다.

$(달러 기호)는 $

<?php
$zz = '/\d+努力$/';
$string1 = "12321124333努力";
//$string2
$string2 = "12311124112313力";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

앞의 문자로 끝나야 합니다.

실행하고 결과를 살펴보고 결론을 도출해 보겠습니다.

$string1은 성공적으로 일치했지만 $string2는 성공적으로 일치하지 못했습니다.

$ 앞의 문자는 d+이고 그 뒤에 중국어가 있습니다.

그러므로 경기는 이번 경기입니다. d는 0~9의 정수를 의미하고, +부호는 0~9 중 적어도 하나를 나타낸다

b와 B의 단어경계와 비단어경계

뭐 설명하겠습니다 경계:

1. 정규 표현식에는 경계가 있습니다. 이 경계는 구분 기호의 시작과 끝이 규칙적인 경계입니다.

2. 영문 단어이고 뒤에 공백이 옵니다. 단어가 끝났고 단어의 경계에 도달했다는 뜻입니다

b 단어 경계는 시작 또는 끝에 있어야 함을 의미합니다.
B는 경계가 없습니다. 즉, 정규 표현식의 시작이나 끝에 올 수 없습니다.

<?php
$zz = '/\w+\b/';
$string1 = "this is a apple";
$string2 = "thisis a apple";
$string3 = "thisisaapple";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

결론:

$string1, $string2 및 $string3이 모두 성공적으로 일치합니다.

$string1이 일치하면 이 공간이 경계입니다.

$string2가 일치하면 이것이 경계입니다.

$string3이 일치하면 thisisaapple이 경계입니다. 전체 정규 표현식도 마찬가지입니다. 그래서 시합은 성공적이다.

단어가 아닌 경계로 실험해 보겠습니다.

<?php
$zz = '/\Bthis/';
$string1 = "hellothis9";
//$string2 = "hello this9";
//$string2 = "this9中国万岁";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

요약:

$string1은 성공적으로 일치하지만 $string2는 실패합니다.

B 뒤에 this가 오기 때문에 단어 경계(공백 및 시작과 끝)에 나타날 수 없습니다.

{m}은 m번만 나타날 수 있으며

<?php
$zz = '/喝\d{3}酒/';
$string1 = "喝988酒";
//$string2 = "喝98811酒";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

결론:
위의 예에서 d{3}는 0~9가 3번만 나타날 수 있다고 규정했습니다. 한 번도 적지 않습니다.

{n,m}은 n ~ m번 나타날 수 있습니다

<?php
$zz = '/喝\d{1,3}酒/';
$string1 = "喝9酒";
//$string2 = "喝988酒";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

결론:
위의 예에서는 d{1에 0-9를 지정했습니다. 3} 한 번, 두 번, 세 번만 나타날 수 있습니다. 그 외 모든 시간은 모두 틀렸습니다

{m,} 최소 m번, 최대 횟수는 제한되지 않습니다

<?php
$zz = '/喝\d{2,}/';
$string1 = "喝9";
//$string2 = "喝98";
//$string3 = "喝98122121";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

결론:
d{2,} 위의 예에서는 음료 뒤에 나오는 0~9의 숫자가 적어도 두 번 나타나도록 규정하고 있으며 최대 횟수에는 제한이 없습니다. 따라서 $string1은 일치에 실패하고 $string2는 성공적으로 일치됩니다. $string3이(가) 성공적으로 일치했습니다.

매칭 규칙

기본 패턴 매칭

모든 것은 기본부터 시작됩니다. 패턴은 정규식의 가장 기본적인 요소이며 문자열의 특성을 설명하는 문자 집합입니다. 패턴은 일반 문자열로 구성된 단순할 수도 있고, 특수 문자를 사용하여 다양한 문자, 반복 또는 컨텍스트를 나타내는 경우가 많은 매우 복잡한 것일 수도 있습니다. 예:

^once

이 패턴에는 특수 문자 ^가 포함되어 있습니다. 즉, 패턴은 one으로 시작하는 문자열과만 일치합니다. 예를 들어, 이 패턴은 "once upon a time"이라는 문자열과 일치하지만 "There Once was a man from NewYork"와는 일치하지 않습니다. ^ 기호가 시작을 나타내는 것처럼 $ 기호는 주어진 패턴으로 끝나는 문자열과 일치합니다.

bucket$

이 패턴은 "누가 이 현금을 모두 양동이에 보관했는지"와 일치하지만 "buckets"와는 일치하지 않습니다. ^ 및 $ 문자를 함께 사용하면 정확한 일치를 나타냅니다(문자열은 패턴과 동일함). 예:

^bucket$

"bucket" 문자열과만 일치합니다. 패턴에 ^ 및 $가 포함되어 있지 않으면 패턴이 포함된 모든 문자열과 일치합니다. 예: 패턴

once

with string

한 번은 뉴욕에서 온 남자
현금을 통에 담아두었던 사람.

이 짝이다.

이 패턴의 문자(o-n-c-e)는 문자 그대로의 문자입니다. 즉, 숫자와 마찬가지로 문자 자체를 나타냅니다. 구두점 및 흰색 문자(공백, 탭 등)와 같은 약간 더 복잡한 문자에는 이스케이프 시퀀스가 ​​필요합니다. 모든 이스케이프 시퀀스는 백슬래시()로 시작됩니다. 탭 문자의 이스케이프 시퀀스는 t입니다. 따라서 문자열이 탭 문자로 시작하는지 감지하려면 다음 패턴을 사용할 수 있습니다.

^t

마찬가지로 n을 사용하여 나타냅니다. " 개행", r은 캐리지 리턴을 의미합니다. 백슬래시 앞에 다른 특수 기호를 사용할 수 있습니다. 예를 들어 백슬래시 자체는 \로 표시되고 마침표는 .로 표시됩니다.

문자 클러스터

인터넷 프로그램에서는 일반적으로 사용자 입력을 확인하기 위해 정규식을 사용합니다. 사용자가 FORM을 제출할 때 입력된 전화번호, 주소, 이메일 주소, 신용카드 번호 등이 유효한지 확인하기 위해 일반 리터럴 문자를 사용하는 것만으로는 충분하지 않습니다.

따라서 우리가 원하는 패턴을 설명하기 위해 좀 더 자유로운 방법, 즉 문자 클러스터를 사용해야 합니다. 모든 모음을 나타내는 클러스터를 만들려면 모든 모음을 대괄호로 묶습니다.

[AaEeIiOoUu]

이 패턴은 모든 모음 문자와 일치하지만 표시만 가능합니다. 한 문자. 하이픈을 사용하여 다음과 같이 문자 범위를 나타냅니다.

[a-z] // 모든 소문자 일치
[A-Z] // 모든 대문자 일치
[a- zA- Z] //모든 문자 일치
[0-9] //모든 숫자 일치
[0-9.-] //모든 숫자, 마침표 및 빼기 기호 일치
[ frtn ] //모두 일치 흰색 문자

다시 말하지만, 이는 매우 중요한 한 문자만 나타냅니다. "z2", "t6" 또는 "g7"과 같이 소문자와 숫자로 구성된 문자열을 일치시키되 "ab2", "r2d3" 또는 "b52"는 일치시키지 않으려면 다음 패턴을 사용하십시오.

^[a-z][0-9]$

[a-z]는 26자의 범위를 나타내지만 여기서는 첫 번째 문자열에만 사용할 수 있습니다. 문자가 소문자인 경우와 일치합니다.

앞서 ^가 문자열의 시작을 나타낸다고 언급했지만 또 다른 의미도 있습니다. ^가 대괄호 안에 사용되면 "아님" 또는 "제외"를 의미하며 특정 문자를 제거하는 데 자주 사용됩니다. 이전 예를 사용하면 첫 번째 문자는 숫자가 될 수 없습니다.

^[^0-9][0-9]$

이 패턴은 "&5", "g7" 및 "-2"와 일치하지만 "12" 및 "66"과 일치하지 않습니다. 다음은 특정 문자를 제외하는 몇 가지 예입니다.

[^a-z] //소문자를 제외한 모든 문자
[^\/^] //()(/)(^)를 제외한 모든 문자
[^" '] //모두 큰따옴표(")와 작은따옴표(')를 제외한 문자

특수문자 "."(점, 마침표)는 정규식에서 사용됩니다. "새줄"을 제외한 모든 문자를 나타냅니다. 따라서 "^.5$" 패턴은 숫자 5로 끝나고 "줄바꿈"이 아닌 다른 문자로 시작하는 모든 두 문자 문자열과 일치합니다. "." 패턴은 빈 문자열과 "새 줄"만 포함하는 문자열을 제외한 모든 문자열과 일치할 수 있습니다.

PHP의 정규식에는 몇 가지 공통 문자 클러스터가 내장되어 있으며 목록은 다음과 같습니다.

문자 클러스터                                                  🎜>[[:alpha:]] 모든 문자

[[:digit:]] 모든 숫자

[[:alnum:]] 모든 문자 및 숫자
[[:space:]] 모든 공백 문자

[[:upper:]] 모든 대문자

[[:lower:]] 모든 소문자

[[:punct:]] 모든 구두점 표시

[[:xdigit:]] [0-9a-fA-F]에 해당하는 임의의 16진수

중복 식별


지금까지 문자나 숫자를 일치시키는 방법을 이미 알고 계셨지만 더 많은 경우 단어나 숫자 그룹을 일치시키고 싶을 수도 있습니다. 단어는 여러 글자로 구성되고, 숫자 그룹은 여러 개의 단수로 구성됩니다. 문자 또는 문자 클러스터 뒤의 중괄호({})는 이전 콘텐츠가 반복되는 횟수를 결정하는 데 사용됩니다. 문자 클러스터

설명

^[a-zA-Z_]$ 모든 문자 및 밑줄

^[[:alpha:]]{3}$ 세 글자로 된 모든 단어

^a$ 문자 a
^a{4} $ aaaa

^a{2,4}$ aa,aaa 또는 aaaa

^a{1,3}$ a,aa 또는 aaa

^a{2 ,}$ 두 개 이상의 a가 포함된 문자열

^a{2,} 예: aardvark 및 aaab, 하지만 apple은 작동하지 않음

a{2,} 예: baad 및 aaa, 하지만 Nantucket 작동하지 않습니다

t{2} 두 개의 탭 문자

.{2} 모두 두 개의 문자

이 예에서는 중괄호의 세 가지 용도를 설명합니다. 숫자, {x}는 "이전 문자 또는 문자 클러스터가 x번만 나타남"을 의미합니다. 숫자와 쉼표, {x,}는 "이전 내용이 x개 이상 나타남"을 의미합니다. ,y}는 "이전 콘텐츠가 x회 이상 표시되지만 y회 이하로 표시됨"을 의미합니다. 패턴을 더 많은 단어나 숫자로 확장할 수 있습니다.

^[a-zA-Z0-9_]{1,}$ //둘 이상의 문자, 숫자 또는 밑줄 문자열을 포함하는 모두
^[1-9]{1,}$ //모든 양수
^-{0,1}[0-9]{1,}$ //모든 정수
^[-]?[ 0-9]+.?[0-9]+$ //모든 부동 소수점 숫자

마지막 예는 이해하기 쉽지 않죠? 이렇게 보면 모든 것이 선택적 빼기 기호([-]?)(^)로 시작하고 그 뒤에 1개 이상의 숫자([0-9]+)가 오고 그 뒤에 소수점(.)이 옵니다. 1 또는 더 많은 숫자([0-9]+)가 있고 그 뒤에는 다른 숫자($)가 없습니다. 아래에서는 사용할 수 있는 더 간단한 방법에 대해 알아봅니다.

특수 문자 "?"는 {0,1}과 동일하며 둘 다 "0 또는 1개의 이전 콘텐츠" 또는 "이전 콘텐츠는 선택 사항"을 나타냅니다. 따라서 지금의 예는 다음과 같이 단순화될 수 있습니다:

^-?[0-9]{1,}.?[0-9]{1,}$

특수 문자 "*"는 {0,}와 동일하며 둘 다 "0개 이상의 이전 내용"을 나타냅니다. 마지막으로 문자 "+"는 "1개 이상의 이전 내용"을 의미하는 {1,}과 동일하므로 위의 4가지 예는 다음과 같이 작성할 수 있습니다.

^[a-zA - Z0-9_]+$ //하나 이상의 문자, 숫자 또는 밑줄을 포함하는 모든 문자열
^[0-9]+$ //모든 양수
^-?[0-9] +$ // 모든 정수
^-?[0-9]*.?[0-9]*$ //모든 부동 소수점 숫자

물론 이것은 작동하지 않습니다. 기술적으로 정규식은 복잡하지만 읽기가 더 쉽습니다.




다음 섹션
<?php //加上了括号 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
코스웨어