>  기사  >  백엔드 개발  >  정규식에 대한 자세한 설명

정규식에 대한 자세한 설명

步履不停
步履不停원래의
2019-07-01 16:25:525419검색

정규식에 대한 자세한 설명

정규식 언어는 리터럴(일반) 텍스트 문자와 메타 문자라는 두 가지 기본 문자 유형으로 구성됩니다.

관련 권장사항:
1. 정규식 구문 튜토리얼(온라인 테스트 도구 포함)
2. PHP 정규식 빠른 입력 비디오 튜토리얼

메타 문자에는 정규식을 사용한 처리 기능이 있습니다. 메타 문자는 [ ]에 있는 단일 문자일 수 있습니다(예: [a]는 단일 소문자 a와 일치함을 의미함). 문자 시퀀스(예: [a-d]a, b, c, d 사이의 모든 문자와 일치함을 의미하고 w는 모든 영어 문자, 숫자를 의미함) 및 밑줄), 일반적인 메타 문자는 다음과 같습니다: [ ] 中的任意单个字符(如 [a]表示匹配单个小写字符 a),也可以是字符序列(如 [a-d] 表示匹配 a 、b、 c、 d 之间的任意一个字符,而 w 表示任意英文字母和数字及下划线),常见的元字符如下:

常见的元字符

字符 描述 特别说明
. 匹配除换行符(n)以外的任意字符 ~
[abcde] 匹配 a b c d e 之中的任意一个字符 所有字符是 的关系
[a-h] 匹配 ah之间的任意一个字符 ~
[^fgh] 不与 fgh之中的任意一个字符匹配 在 中括号[ ] 的第一个字符前加上 ^ 表示 取反
不匹配中括号里面出现的任意字符
w 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于[a-zA-Z0-9_] ~
W w 相反,相当于 [^a-zA-Z0-9_] ~
s 匹配任意的空白符,相当于 [fnrtv] ~
S s相反,相当于 [^s] ~
d 匹配任何 0 到 9 之间的单个数字,相当于 [0-9] ~
D d 相反,相当于[^0-9] ~
[u4e00-u9fa5] 匹配任意单个汉字(中文)(这里用的是 Unicode 编码表示的汉字) ~
b 匹配单词的开始或结束 ~
^ 匹配字符串的开始 放在中括号的第一个字符前 则变为 取反的意思
$ 匹配字符串的结束 ~

正则表达式限定符

作用:限定这个符号前面 一个 单元 多出现的次数
单元:

  1. 如果前面出现的是一个字符的话,则这一个字符就为一个 单元
  2. 如果前面我们用小括号把一个很长的字符串括起来的话,那么整个小括号里面都算是一个 单元

上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符,下面是一些常见的限定符(下表中 n 和 m 都是表示 整数。)

🎜[abcde]🎜🎜는 a b c d e 중 임의의 문자와 일치합니다. 🎜🎜모든 문자는 또는 🎜🎜🎜<code>[a-h]🎜🎜는 ah🎜🎜~ 🎜🎜🎜[^ 사이의 모든 문자와 일치합니다. fgh]🎜🎜는 괄호 [ ] 안의 fgh🎜🎜에 있는 어떤 문자와도 일치하지 않습니다. 표시할 첫 번째 문자 앞에 ^를 추가하세요. reverse 🎜 대괄호 안에 표시되는 문자와 일치하지 않습니다. 🎜🎜🎜w 🎜🎜대문자 및 소문자 영어 문자, 0~9 사이의 숫자 및 밑줄과 일치합니다. , [a-zA-Z0-9_]🎜🎜~🎜🎜🎜 W🎜🎜와 동일하며 w의 반대입니다. [^a-zA-Z0-9_]🎜🎜~🎜🎜🎜s 🎜🎜와 동일하며 와 동일하게 모든 공백 문자와 일치합니다. [fnrtv]🎜🎜~🎜🎜🎜S🎜🎜 및 s code>대신 <code>[^s]와 동일 🎜🎜~🎜🎜🎜d🎜🎜는 0에서 9 사이의 단일 숫자와 일치하며 [0-9]🎜🎜~🎜🎜과 동일합니다. 🎜D🎜🎜는 d의 반대이며 [^0- 9]🎜🎜~🎜🎜🎜[u4e00-u9fa5]🎜🎜는 단일 한자(중국어)와 일치합니다(유니코드 인코딩으로 표시되는 한자)🎜🎜~🎜🎜 🎜b🎜🎜단어의 시작 또는 끝과 일치🎜🎜~🎜🎜🎜^🎜🎜일치하는 문자열🎜🎜의 시작은 다음과 같습니다. <strong>reverse</strong>🎜🎜<tr>🎜<code>$를 의미하는 대괄호의 첫 번째 문자 앞에 배치됩니다. 🎜🎜문자열의 끝 부분과 일치🎜🎜~🎜🎜🎜🎜정규 표현식 한정자🎜함수: 이 기호 앞의 단위 발생 횟수를 제한합니다.🎜 단위:🎜
  1. 문자 앞에 나타나면 이 문자는 단위입니다.
  2. 앞에 괄호를 사용하는 경우 매우 긴 문자열을 묶으면 전체 괄호가 단위
🎜위의 메타 문자는 모두 단일 문자와 일치합니다. 동시에 여러 문자를 일치시키려면 다음과 같은 몇 가지 공통 한정자를 사용해야 합니다. (아래 표의 n과 m은 모두 정수를 나타냅니다. )🎜
字符 描述 特别说明
* 匹配 0 到 多 个元字符,相当于 {0,} ~
? 匹配 0 到 1 个元字符, 相当于 {0,1} ~
+ 匹配至少 1 个元字符,相当于 {1,} ~
{n} 匹配 n 个元字符 ~
{n,} 匹配至少 n 个元字符 ~
{n,m} 匹配 n 到 m 个元字符 ~
b 匹配单词边界 ~
^ 字符串必须以指定的字符开始 ~
$

공통 메타 문자

를 제외한 모든 문자 ~
문자 설명 특별 지침
. 개행 문자를 제외하고 일치(n)
🎜🎜*🎜🎜는 0과 여러 메타 문자를 일치시킵니다. 이는 {0,}🎜🎜~🎜🎜🎜?🎜와 동일합니다. 🎜는 {0,1}🎜🎜~🎜🎜🎜+🎜🎜에 해당하는 0~1개의 메타 문자와 일치하며 {1,}🎜🎜~🎜🎜🎜{n}🎜🎜는 n개의 메타문자와 일치 🎜🎜~🎜🎜🎜{n,}🎜🎜n개 이상의 메타문자와 일치🎜🎜~🎜🎜🎜{n,m}🎜🎜n~m개의 메타문자와 일치🎜🎜 ~🎜🎜🎜 b🎜🎜단어 경계 일치🎜🎜~🎜🎜🎜^🎜🎜문자열은 지정된 문자로 시작해야 합니다🎜🎜~ 🎜🎜🎜$ 🎜🎜문자열은 지정된 문자🎜🎜~🎜🎜🎜🎜로 끝나야 합니다.

설명 - 특수 사례

  1. 여러 메타 문자 또는 리터럴 텍스트 문자를 괄호로 묶어 그룹을 형성할 수 있습니다(예: ^(13)[4-9 ]). d{8}$는 13으로 시작하는 모든 휴대전화 번호를 나타냅니다. 分组,比如 ^(13)[4-9]d{8}$ 表示任意以 13 开头的移动手机号码。
    1. abcabcabc+  表示 最后的字母 c 出现 1 次或 多次;
    2. (abcabcabc)+ 表示 整个字符串 abcabcabc 出现 1 次或 多次。
  2. 可以使用 | 来表示 的关系,例如 z|j|q 表示匹配 z 、j、q 之中的任意一个字母。其实等价于 [zjq]
    1. ab|cd|ef 表示的是:要么是 ab、要么是 cd要么是 ef
    2. a(b|cd|e)f 表示的是:以a开头,要么是 b、要么是 cd要么是 e,最后以f结尾。
    3. 总结:|) 的唯一边界是 小括号( )
  3. [0-9A-Z.?] 这个正则你如何理解?
    1. .? 出现在中括号中时,.? 将变为 普通字符,它就是 点 和 问号。你可以理解为 [ ] 的优先级要大于. 和 ? 的优先级。
    2. 此正则表达式将会完全匹配字符串 ?aaa.bbb ,记住这里 . 和 ? 被完全当做了普通字符。

高级1 - 多选结构

多选结构其实就是元字符 | (或)的使用。
界定范围:开头、结尾、小括号

캐릭터 설명 특별 지침
abcabcabc+는 마지막 문자 c가 1번 이상 나타나는 것을 의미합니다. (abcabcabc)+는 전체 문자열abcabcabc가 1회 이상 나타납니다. |를 사용하여 또는 의 관계를 나타낼 수 있습니다(예: z|j|q는 <code>z, j, q 중 모든 문자와 일치함을 나타냅니다. 실제로 [zjq]와 동일합니다.
    正则 含义
    Windows98|Windows2000|WindowsXP 匹配Windows98或者Windows2000或者WindowsXP
    ^Windows98|Windows2000|WindowsXP$ Windows98开头或者包含Windows2000或者以WindowsXP结尾
    注意^$都包含在|的范围内,因为|的界限只有:开头、结尾、小括号
    Windows(98|2000|XP) Windows然后98 或者2000或者XP
    ab|cd|efab, cd 또는 ef를 의미합니다. . 🎜a(b|cd|e)fa로 시작, b 또는 cd를 의미합니다. code>는 e이고 f로 끝납니다. 🎜요약: |( 또는 )의 유일한 경계는 🎜괄호(( ))입니다.🎜[0-9A-Z.?] 이 규칙을 어떻게 이해하시나요?
      🎜.?가 🎜대괄호, . 안에 표시되는 경우는 무엇입니까? 는 점과 물음표로 구성된 🎜일반 문자가 됩니다. [ ]의 우선순위가 및 ?의 우선순위보다 높다는 것을 알 수 있습니다. 🎜이 정규식은 ?aaa.bbb 문자열과 정확히 일치합니다. 여기서 및 ?는 완전히 일반 문자로 처리됩니다.
    🎜고급 1 - 다중 선택 구조🎜

    다중 선택 구조는 실제로 | 메타 문자를 사용하는 것입니다. .
    범위 정의: 시작, 끝, 괄호

    🎜 thead >
    일반 의미
    Windows98|Windows2000|WindowsXP🎜 Windows98, Windows2000 또는 WindowsXP 🎜🎜<tr> <td> <code>^Windows98|Windows2000|WindowsXP$🎜 Windows98로 시작하거나 Windows2000을 포함하거나 WindowsXP로 종료
    ^$는 모두 | 범위에 포함됩니다. | 유일한 경계는 시작, 끝, 괄호 🎜🎜
    Windows(98|2000|XP)🎜 Windows 다음 입니다. 98 또는 2000 또는 XP🎜🎜🎜🎜

    요약: 다중 선택 구조에는 많은 문자가 포함될 수 있지만 괄호의 경계를 초과할 수 없습니다. 括号 的界限。

    高级2 - 分组与后向引用

    分组

    • 我们已经了解怎么重复单个字符;
    • 但如果想要重复一个字符串该怎么办?你 可以用小括号来指定子表达式(也叫做分组)
    • (d{1,3}.){3}d{1,3} 简单的 IP 地址匹配表达式
    • 但是它也将匹配 256.300.888.999 这种不可能存在的 IP 地址。你能写一个更准确的正则?
    • ((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)

    反向引用

    • 使用小括号指定一个子表达式(分组)后,匹配这个子表达式的文本可以被捕获,从而在表达式或其他程序中作进一步的处理。
    • 默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为 1 ,第二个为 2 ,依次类推

    示例:

    • b(w+)bs+1b 可以用来匹配重复的单词
    • 匹配诸如:where where go, tom tom happy

    直白解释:
    正则表达式中,前面用小括号进行划分(分组),后面把小括号匹配到的内容引用到后面来,分别用12等 来表示。(第一个小括号极1...)。如果存在 小括号嵌套小括号的情况 (w+(.?)) 记住:这个时候要以 ( 为标志 从左往右 数小括号就可以了。

    高级3 - 环视(零宽断言)

    • 环视不匹配任何字符,只匹配文本中的 特定位置。类似于b^$ 那样。环视不会占用字符。
    • 环视分为顺序逆序两种:
      • 顺序
        • (?=exp) 位置的后面能匹配 exp。例如:(?=d) 当前位置右边是数字。
        • (?!exp) 位置的后面不能匹配 exp。例如:(?!d) 当前位置右边不是数字。
      • 逆序
        • (?<=exp) 位置的前面能匹配 exp。例如:(?<=d) 当前位置左边是数字
        • (?<!exp) 位置的前面不能匹配 exp。例如:(?!d) 当前位置左边不是数字。

    高级4 - 贪婪与懒惰

    • 当正则表达式中包含能接受重复的 量词 (指定数量的代码,例如:+*{3,12} 等)时, 通常的行为是匹配尽可能多的字符
    • 正则表达式:a.*b,它将会匹配最长的以 a 开始,以 b 结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab,这被称为 -------贪婪匹配
    • -
    • 我们更需要 懒惰匹配,也就是匹配尽可能少的字符,前面给出的量词都可以被转化为 懒惰匹配模式, 只要在它后面加一个问号 ? 。这样 .*? 就意味着匹配任意数量的重复,但是在能使整个 匹配成功的前提下使用最少的重复
    • a.*?b 匹配最短的,以 a 开始, 以 b 结束的字符串。如果把它应用于 aabab 的话,它会匹配 aabab

    总结:

    贪婪与懒惰模式之间的区别就在于:懒惰模式 在量词 * 的后面多了一个 问号 ?

    고급 2 - 그룹화 및 역참조

    그룹화

    • 우리는 이미 단일 문자를 반복하는 방법을 알고 있습니다.
    • 그러나 문자열을 반복하려면 무엇을 해야 할까요? 할?
    괄호를 사용하여 하위 표현식(그룹화라고도 함)을 지정할 수 있습니다

    .

  1. (d{1,3}.){3}d{1,3} 간단한 IP 주소 일치 표현식
  2. 그러나 이는 또한 불가능한 IP 주소 256.300.888.999. 더 정확한 정규식을 작성할 수 있나요?
  3. ((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[ 0-5]|[01]?dd?)
  4. 역참조

    • 괄호를 사용하여 하위 표현식 지정( 그룹화 후 ) , 이 하위 표현식과 일치하는 텍스트는 표현식이나 다른 프로그램 내에서 추가 처리를 위해 캡처될 수 있습니다.
    • 기본적으로 각 그룹에는 자동으로 그룹 번호가 있습니다. 규칙은 다음과 같습니다. 그룹의 왼쪽 대괄호를 표시로 왼쪽에서 오른쪽으로 첫 번째 그룹 number 그룹 번호는 1, 두 번째는 2, 등등입니다🎜.
    🎜🎜예: 🎜🎜
    • b(w+)bs+1b는 반복되는 단어를 일치시키는 데 사용할 수 있습니다.
    • 다음과 같은 단어와 일치 as :where where go, tom tom happy
    🎜🎜 간단한 설명: 🎜
    정규 표현식에서는 괄호를 사용하여 앞 부분과 부분 부분을 구분(그룹화)합니다. back 괄호🎜에 일치하는 내용을 뒤쪽에 인용하고, 1, 2 등을 이용하여 각각 표현합니다. (첫 번째 괄호는 1...)입니다. 괄호 (w+(.?)) 안에 괄호가 중첩되어 있는 경우 기억하세요: 이때 (를 기호로 사용하여 왼쪽에서 오른쪽으로 괄호 수를 계산하세요. 🎜🎜 고급 3 - 탐색(너비 없음 어설션) 🎜
    • 탐색은 어떤 문자와도 일치하지 않으며 텍스트의 🎜특정 위치🎜만 일치합니다. b, ^와 유사합니다. code>, <code>$ 🎜 둘러보기는 문자를 차지하지 않습니다. 🎜
    • 둘러보기는 🎜순서🎜와 🎜역순🎜으로 구분됩니다.
      • 순서
        • (?=exp)는 🎜 exp 위치 뒤의 🎜와 일치할 수 있습니다. 예: (?=d) 현재. 위치의 오른쪽은 숫자입니다.
        • (?!exp)는 🎜 exp와 일치할 수 없습니다. 예: (?! d) 현재 위치의 오른쪽이 숫자가 아닙니다
      • 역순
        • (?<=exp) 위치의 앞부분입니다. 🎜 exp와 일치할 수 있습니다. 예: (?<=d) 현재 위치의 왼쪽은 숫자입니다 li>
        • (?<!exp). 앞의 🎜는 🎜 exp와 일치할 수 없습니다. 예: (?!d) 현재 위치의 왼쪽은 숫자가 아닙니다.
        li>
    🎜고급 4 - 탐욕스럽고 게으르다🎜
    • 정규 표현식에 반복을 허용하는 🎜정량자🎜가 포함된 경우(코드 수를 지정하세요. 예: +, *, {3,12} code> 등), 🎜일반적인 동작은 가능한 한 많은 문자를 일치시키는 것입니다🎜
    • .
    • 정규식: a.*b, 시작하는 가장 긴 문자열과 일치합니다. a로 시작하고 b로 끝납니다. aabab를 검색하는 데 사용하면 전체 문자열 aabab와 일치합니다. > -------🎜탐욕스러운 매칭🎜
    • -
    • 우리는 🎜지연 매칭🎜이 필요합니다. 즉, 가능한 한 적은 수의 문자를 매칭하는 것입니다. 위에 주어진 패턴은 게으른 일치 패턴으로 변환될 수 있습니다. 🎜? 뒤에 물음표만 추가하면 됩니다 🎜. 이렇게 하면 .*?는 반복 횟수에 관계없이 일치하지만 가장 적은 반복 🎜을 사용하여 전체 🎜 일치를 성공적으로 만드는 것을 의미합니다.
    • a.*?ba로 시작하고 b로 끝나는 가장 짧은 문자열과 일치합니다. aabab에 적용하면 aabab와 일치합니다.
    🎜요약: 🎜
    🎜그리디 모드와 게으른 모드의 차이점은 다음과 같습니다. 🎜Lazy 모드🎜 한정자 * 뒤에 추가 물음표 가 있습니까? . 🎜🎜🎜고급 5 - 패턴 매칭의 우선순위🎜🎜정규 표현식을 사용할 때는 매칭 순서에 주의해야 합니다. 일반적으로 계산은 동일한 우선순위(🎜왼쪽에서 오른쪽으로🎜)로 수행되고 연산은 서로 다른 우선순위(🎜높은 우선순위, 그 다음 낮은🎜)로 수행됩니다. 다양한 연산자의 매칭 순서 우선순위는 🎜높은 것부터 낮은 것까지🎜 아래 표와 같습니다. 🎜ㅋㅋㅋ 24
    ( ), (?:), (?=), []모드 단위 및 원자 테이블 3 *, +, ? , {n}, {n,}, {n,m}중복 일치
    ^, $, b, B, A, Z 경계 제한 转义字符
    2 ()(?:)(?=)[] 模式单元和原子表
    3 *+{n}{n,}{n,m} 重复匹配
    4 ^$bBAZ 边界限制
    5 | 模式选择

    实例

    1. 字符转义

    1问:要匹配字符串 33333333333 中的 $ 正则应该怎么写?
    2问:如果在 PHP 中 preg_match 函数分别用单引号双引号的表达式来匹配上面的 $,怎么写?

    答案:

    • 表达式需要的规则是 $
    • 用单引号表示上面的字符串 '/\$/'。(为方便查看我们拆分一下为 '/\  \  \  $/'
    • 用双引号表示上面的字符串 "/\$/"。(为方便查看我们拆分一下为 "/\  \  \  $/"
    • 问什么呢?

    再答:

    1. PHP 中单引号不转义任何字符,但是唯独转义 ,所以我们需要 6个 来生成表达式。
    2. 双引号除了转义 以外,还需要多一个 用来转义 $ 所以它 需要 7 个

    5

    |

    모드 선택🎜🎜

    1. 문자 이스케이프

    🎜1Q: 문자열 333333$3333333에서 $와 일치하는 정규식을 어떻게 작성해야 합니까?
    2Q: PHP의 preg_match 함수가 🎜작은따옴표🎜와 🎜큰따옴표🎜 표현식을 사용하여 위의 $와 일치하는 경우 어떻게 작성하나요? 🎜🎜🎜답변: 🎜🎜
    • 표현식에 필요한 규칙은 \$입니다.🎜
    • 위 문자열 '/\\\$를 나타내려면 작은따옴표를 사용하십시오. /'. (보기 쉽게 '/\ \ \ $/'로 나누었습니다.) 🎜
    • 위 문자열 "/\\\$/". (보기 쉽게 <code>"/\ \ \ $/"로 나누었습니다.) 🎜
    • 무엇을 물어보시나요? 🎜
    🎜🎜다시 대답해 주세요: 🎜🎜
    1. PHP에서 작은따옴표는 어떤 문자도 이스케이프하지 않지만 만 이스케이프되므로 6개의 가 필요합니다. / code> 표현식을 생성합니다. 🎜<li>🎜<code>를 이스케이프하는 것 외에도 큰따옴표에는 $를 이스케이프하려면 가 하나 더 필요하므로 7개의 가 필요합니다. 코드>. 🎜🎜🎜🎜 추천 관련 튜토리얼: 🎜PHP 비디오 튜토리얼🎜🎜

    위 내용은 정규식에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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