正则表达式

1.简述

正则表达式是一种用来描述字符串模式的方法,通常用于在文本中搜索、匹配、替换特定的字符序列。它由字符和操作符构成,可以用来定义搜索模式,包括文本中的字符类型、数量、位置等信息

2.正则语法

1.元字符

1.简述

元字符是正则表达式中具有特殊含义的字符,它们不代表自身的字符,而是用于指定匹配规则的特殊符号

2.常见的元字符

代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始(在集合字符里[ ^a ]表示非(不匹配)的意思
$匹配字符串的结束

3.详解

  1. . 匹配任何任意字符。例如,. 可以匹配字符串中的任何单个字符,包括数字、字母、符号等例如:. 可以匹配字符串中的 1n*+- 等字符
  2. \d\w\s 匹配第一个字符为数字,第二个字符为字母或数字、或下划线或汉字,第三字符为空格的字符串具体解释如下:
    • \d 匹配一个数字字符。
    • \w 匹配一个字母字符、数字、下划线或汉字。
    • \s 匹配一个空白字符(空格、制表符、换行符等)
    例如,112a1_ 都符合这个匹配模式
  3. ^\d\d\d$ 匹配三个全部都为数字的字符串具体解释如下:
    • ^ 匹配字符串的开头。
    • \d 匹配一个数字字符。
    • {3} 表示匹配前面的模式(\d)三次。
    • $ 匹配字符串的结尾
    例如:123456789 都符合这个匹配模式。这个正则表达式还可以用于验证输入的字符串是否符合 QQ 号(身份证号)的格式要求例如:^\d{8}$ 匹配8位数字的 QQ 号,^\d{15}$ 匹配15位数字的身份证号
  4. \bOlive\b 匹配单词 Olive具体解释如下:
    • \b 表示单词的边界
    • Olive 匹配字符串中的单词 Olive
    • \b 表示单词的边界
    例如,在字符串 I Love Oliver and Olive 中,该正则表达式匹配的是 Olive,而不是 Oliver,因为 \b...\b 返回的是匹配的整个单词

2.反义字符

1.简述

  • 反义字符在正则表达式中用于表示与某些字符相反的匹配规则
  • \ 开头,后面跟着一个大写字母或一个特殊的字符,用于匹配除了指定字符之外的任意字符

2.常见反义字符

代码/语法说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

3.详解

  1. \W:匹配除了字母、数字、下划线(_)、以及汉字以外的所有字符示例:\W 匹配的字符包括空格、标点符号、特殊符号等,例如 +, -, *, ?, (, ), ! 等。
  2. \S:匹配除了空白字符以外的所有字符。空白字符包括空格、制表符、换行符等。示例:\S 匹配的字符包括数字、字母、标点符号、特殊符号等,例如 1, *, (, ), ! 等。
  3. [^abcde]:匹配除了指定字符集 [abcde] 之外的所有字符。示例:[^abcde] 匹配的字符包括除了 a, b, c, d, e 之外的所有字符,例如 f, g, h, 1, *, (, ), ! 等。

3.限定字符

1.简述

限定字符用于指定匹配模式中某个元素的重复次数或范围

2.常见的限定字符

代码/语法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次

3.详解

这些是对常见限定字符的很好的解释,让我稍作补充:

  1. \d*:匹配重复 0 次或多次数字。示例:\d* 可以匹配任意长度的数字串,包括空串,如 '''123''456789'
  2. \d+:匹配重复 1 次或多次数字示例:\d+ 至少匹配一个数字,如 '1''12345''67890' 等。
  3. \d?:匹配重复 0 次或 1 次数字示例:\d? 可以匹配空串或者一个数字,如 '''5''9'
  4. \d{8}:匹配重复 8 次数字示例:\d{8} 匹配恰好包含 8 个数字的串,如 '12345678''98765432'
  5. \d{4,}:匹配重复至少 4 次数字示例:\d{4,} 至少匹配 4 个数字的串,如 '1234''567890''987654321'
  6. ^\d{8,11}$:匹配重复 8 到 11 次数字示例:^\d{8,11}$ 匹配包含 8 到 11 个数字的串,如 '123456789''9876543210''12345678901'

4.转义字符

1.简述

转义字符在正则表达式中用于表示特殊字符的字面意义,而不是它们的特殊含义

在正则表达式中,许多字符具有特殊含义,如 转义字符在正则表达式中用于表示特殊字符的字面意义.*+

如果要匹配它们的字面意义而不是特殊含义,就需要使用转义字符 .*+

2.详解

例如:

需要匹配qq邮箱 \d{8,}+qq+.+com 在这里的. 就需要加斜杠

5.字符分枝

1.简述

字符分枝指的是在正则表达式中使用括号 ( ) 将多个字符或子表达式组合在一起,形成一个分组,并且这些字符或子表达式之间使用竖线 | 分隔

字符分枝的作用是在匹配时选择其中一个分支进行匹配

2.详解

3.详解

  1. 例如:(简单的例子)正则表达式 (cat|dog) 包含了一个字符分枝,其中 catdog 是两个分支。这个正则表达式将匹配字符串中的 catdog
  2. 例如:(嵌套式的字符分支)(red|blue|green) 匹配字符串中的 redbluegreen,而 ((red|blue)|green) 匹配字符串中的 redblue,或者是 green
  3. 例如:(常用于表达ip地址)(25[0-5]|20-4|[0-1]\d\d).){3}(25[0-5]|20-4|[0-1]\d\d)
    1. 把IP地址分为两部分一部分是123.123.123. 另一部分是123
    2. Ip最大值为255,所以先使用分组,然后在组里边再进行选择
    3. 组里有三部分,0-199,200-249,250-255
    4. 分别和上述的表达是对应,最后还要注意分组之后还要加上一个
    5. 因为是元字符所以要转义故加上\,然后再把这部分整体看做是一个组,重复三次,再加上仅有数字的一组也就是不带\的那一组即可完成IP地址的校验

6.字符分组

1.简述

字符分组多用于将多个字符重复,主要通过使用小括号()来进行分组

2.常见语法分组

分类代码/语法说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里
也可以写成(?’name’exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

3.详解

例如:

  1. ((25[0-5]|2[0-4][0-9]|[0-1]\d\d)\.){3}:
    • 这部分匹配 IP 地址中前三个点之间的内容,包括点
    • 25[0-5] 匹配 250 至 255 之间的数字
    • 2[0-4][0-9] 匹配 200 至 249 之间的数字
    • [0-1]\d\d 匹配 100 至 199 之间的数字
    • (25[0-5]|2[0-4][0-9]|[0-1]\d\d) 这部分是一个分组,匹配 0 至 255 之间的数字
    • \. 匹配点号(需要转义,因为.是元字符,表示匹配任意字符)
    • {3} 表示前述的整个组要重复匹配三次,确保 IP 地址有四段
  2. (25[0-5]|2[0-4][0-9]|[0-1]\d\d):
    • 这个部分是匹配 IP 地址中的最后一段,不包括点号
    • 与上述的逻辑相似,分组中的三个选项分别匹配 0 至 255 之间的数字
  3. 整个表达式匹配 IP 地址的规则为:前三段是数字加点号的组合,每段的数字范围是 0 至 255,最后一段是单独的数字,也是在 0 至 255 之间

7.懒惰匹配

1.简述

匹配尽可能少的字符。在匹配规则中,懒惰匹配通常通过在量词后面添加问号 ? 实现

2.懒惰限定符

代码/语法说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

8.贪婪匹配

1.简述

正则表达式中包含重复的限定符时,通常的行为是匹配尽可能多的字符

2.贪婪限定符

代码/语法说明
*重复任意次,尽可能多重复
+重复1次或更多次,尽可能多重复
?重复0次或1次,尽可能多重复
{n,m}重复n到m次,尽可能多重复
{n,}重复n次以上,尽可能多重复

9.后向引用

1.简述

  • 后向引用是正则表达式中的一种特性,允许在同一个正则表达式中引用先前捕获的文本
  • 通常情况下,后向引用用于查找重复出现的模式,例如匹配相同的单词、数字或其他模式
  • 在正则表达式中,通过在正则表达式中使用捕获组(用括号括起来的部分)来捕获文本,然后可以在同一个表达式中使用反向引用来引用先前捕获的文本
  • 在大多数正则表达式引擎中,可以使用 \数字 的语法来引用捕获组,其中数字表示捕获组的索引或编号

2.详解

假设我们想要匹配重复的单词

\b(\w+)\s+\1\b
  • \b:匹配单词的边界,确保我们匹配的是整个单词
  • (\w+):这是一个捕获组,用于匹配一个或多个单词字符
  • \s+:匹配一个或多个空格字符
  • \1:这是一个后向引用,引用了第一个捕获组中匹配的文本
  • \b:再次匹配单词的边界,确保我们匹配的是整个单词

这个正则表达式将匹配重复出现的单词,例如 “hello hello” 或 “world world”

10.零宽断言

1.简述

  • 用于在匹配位置时不消耗实际的字符
  • 它们是一种零宽度的匹配,不会实际匹配字符,只匹配位置
  • 零宽断言可以用于查找特定模式的位置,而不会实际匹配该模式

2.详解

  1. 正向预测先行(Positive Lookahead):匹配在当前位置之后的文本,但不包括该文本在匹配结果中语法是 (?=...)
  2. 负向预测先行(Negative Lookahead):匹配在当前位置之后的文本,但不包括该文本在匹配结果中语法是 (?!...)
  3. 正向预测后行(Positive Lookbehind):匹配在当前位置之前的文本,但不包括该文本在匹配结果中语法是 (?<=...)
  4. 负向预测后行(Negative Lookbehind):匹配在当前位置之前的文本,但不包括该文本在匹配结果中语法是 (?<!...)

11.其他语法

1..NET常用的处理选项

名称说明
IgnoreCase(忽略大小写)匹配时不区分大小写
Multiline(多行模式)更改^和的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,的精确含意是:匹配\n之前的位置以及字符串结束前的位置)
Singleline(单行模式)更改.的含义,使它与每一个字符匹配(包括换行符\n)
IgnorePatternWhitespace(忽略空白)忽略表达式中的非转义空白并启用由#标记的注释
ExplicitCapture(显式捕获)仅捕获已被显式命名的组

2.其他语法

代码/语法说明
\a报警字符(打印它的效果是电脑嘀一声)
\b通常是单词分界位置,但如果在字符类里使用代表退格
\t制表符,Tab
\r回车
\v竖向制表符
\f换页符
\n换行符
\eEscape
\0nnASCII代码中八进制代码为nn的字符
\xnnASCII代码中十六进制代码为nn的字符
\unnnnUnicode代码中十六进制代码为nnnn的字符
\cNASCII控制字符。比如\cC代表Ctrl+C
\A字符串开头(类似^,但不受处理多行选项的影响)
\Z字符串结尾或行尾(不受处理多行选项的影响)
\z字符串结尾(类似$,但不受处理多行选项的影响)
\G当前搜索的开头
\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp)贪婪子表达式
(?<x>-<y>exp)平衡组
(?im-nsx:exp)在子表达式exp中改变处理选项
(?im-nsx)为表达式后面的部分改变处理选项
(?(exp)yes|no)把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes)同上,只是使用空表达式作为no
(?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes)同上,只是使用空表达式作为no

3.常用的版本

1.常用

  • 只能输入数字:”^[0-9]*$”。
  • 只能输入n位的数字:”^”d{n}$”。
  • 只能输入至少n位的数字:”^”d{n,}$”。
  • 只能输入m~n位的数字:。”^”d{m,n}$”
  • 只能输入零和非零开头的数字:”^(0|1-9*)$”。
  • 只能输入有两位小数的正实数:”^[0-9]+(.[0-9]{2})?$”。
  • 只能输入有1~3位小数的正实数:”^[0-9]+(.[0-9]{1,3})?$”。
  • 只能输入非零的正整数:”^”+?1-9*$”。
  • 只能输入非零的负整数:”^”-1-90-9″*$。
  • 只能输入长度为3的字符:”^.{3}$”。
  • 只能输入由26个英文字母组成的字符串:”^[A-Za-z]+$”。
  • 只能输入由26个大写英文字母组成的字符串:”^[A-Z]+$”。
  • 只能输入由26个小写英文字母组成的字符串:”^[a-z]+$”。
  • 只能输入由数字和26个英文字母组成的字符串:”^[A-Za-z0-9]+$”。
  • 只能输入由数字、26个英文字母或者下划线组成的字符串:”^”w+$”。
  • 验证用户密码:”^[a-zA-Z]”w{5,17}$”正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
  • 验证是否含有%&’,;=?$””等字符:”[%&’,;=?$”x22]+”。
  • 只能输入汉字:”^[“u4e00-“u9fa5]{0,}$”
  • 验证Email地址:”/^([a-zA-Z0-9-])+@([a-zA-Z0-9-])+(.[a-zA-Z0-9_-])+/”。
  • 验证InternetURL:”^http://([“w-]+”.)+[“w-]+(/[“w-./?%&=]*)?$”。
  • 验证电话号码:”^(“(“d{3,4}-)|”d{3.4}-)?”d{7,8}$”正确格式为:”XXX-XXXXXXX”、”XXXX- XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX”。
  • 验证身份证号(15位或18位数字):”^”d{15}|”d{18}$”。
  • 验证一年的12个月:”^(0?[1-9]|1[0-2])$”正确格式为:”01″~”09″和”1″~”12″。
  • 验证一个月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”正确格式为;”01″~”09″和”1″~”31″。

2.限制网页表单里的文本框输入内容

// 用正则表达式限制只能输入中文
οnkeyup="value=value.replace(/[^\\u4E00-\\u9FA5]/g, '')"
onbeforepaste="clipboardData.setData('text', clipboardData.getData('text').replace(/[^\\u4E00-\\u9FA5]/g, ''))"

// 用正则表达式限制只能输入全角字符
οnkeyup="value=value.replace(/[^\\uFF00-\\uFFFF]/g, '')"
onbeforepaste="clipboardData.setData('text', clipboardData.getData('text').replace(/[^\\uFF00-\\uFFFF]/g, ''))"

// 用正则表达式限制只能输入数字
οnkeyup="value=value.replace(/[^\\d]/g, '')"
onbeforepaste="clipboardData.setData('text', clipboardData.getData('text').replace(/[^\\d]/g, ''))"

// 用正则表达式限制只能输入数字和英文
οnkeyup="value=value.replace(/[^\\da-zA-Z]/g, '')"
onbeforepaste="clipboardData.setData('text', clipboardData.getData('text').replace(/[^\\da-zA-Z]/g, ''))"

// 从URL地址中提取文件名的JavaScript程序,如下结果为page1
var url = "http://www.example.com/folder/page1.html";
var filename = url.match(/\/([^\/?#]+)$/)[1];
console.log(filename);
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇