学习知识点记录(一):正则表达式入门

定义与作用

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来:
①检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;
②根据匹配规则对字符串进行灵活的替换操作。

基础规则

普通字符

字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符在匹配字符串时,匹配与之相同的字符。

表达式字符串结果
cabcdetrue
bcdabcdetrue
3abcdefalse

转义字符

一些不便书写的字符以及有特殊作用的标点符号,采用在前面加“\”的方法,都是“转义字符”。

表达式可匹配
\r回车
\n换行符
\t制表符
\\“\”符号本身
\^^符号本身
\$$符号本身
\.小数点(.)本身

与“多种字符”匹配的表达式

表达式可匹配
\d任意一个数字,0~9中的任意一个
\w任意一个字母或数字或下划线,也就是AZ,az,0~9,_中任意一个
\s包括空格、制表符、换页符等空白字符的其中任意一个
.小数点可以匹配除了换行符(\n)以外的任意一个字符
\S匹配所有非空白字符
\D匹配所有非数字字符
\W匹配所有字母、数字、下划线以外的字符
[]包含一系列字符匹配其中任意一个字符
[^]包含一系列字符匹配其中字符之外的任意一个字符

特殊符号

符号意义
{n}表达式重复n次
{m,n}表达式至少重复m次,最多重复n次
{m,}表达式至少重复m次,最多不限制
匹配表达式0次或者1次
+表达式至少出现1次
*表达式不出现或者出现任意次
^与字符串开始的地方匹配,不匹配任何字符
$与字符串结束的地方匹配,不匹配任何字符
\b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
|左右两边表达式之间“或”,匹配左边或者右边
()①在被修饰匹配次数时,括号中的表达式可以作为整体被修饰 ②取匹配结果时,括号中的表达式匹配到的内容可以被单独得到
\B匹配非单词边界,即左右两边都是“\w”范围或者两边都不是“\w”范围时的字符缝隙

高级规则

匹配次数中的贪婪与非贪婪

贪婪

重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。例如:针对文本"dxxxdxxxd",匹配如下:

表达式匹配结果
(d)(\w+)“\w+” 将匹配第一个 “d” 之后的所有字符 “xxxdxxxd”
(d)(\w+)(d)“\w+” 将匹配第一个 “d” 和最后一个 “d” 之间的所有字符 “xxxdxxx”。

由此可见,“\w+” 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 “d”,但那也是为了让整个表达式能够匹配成功。同理,带 “*” 和 “{m,n}” 的表达式都是尽可能地多匹配,带 “?” 的表达式在可匹配表达式0次或者1次的时候,也是尽 可能的 要匹配1次。这 种匹配原则就叫作 “贪婪” 模式 。

非贪婪

重复匹配不定次数的表达式在匹配过程中,总是尽可能少的匹配。针对文本"dxxxdxxxd",匹配如下:

表达式匹配结果
(d)(\w+?)“\w+?” 将尽可能少的匹配第一个 “d” 之后的字符,结果是:“\w+?” 只匹配了一个 “x”
(d)(\w+?)(d)为了让整个表达式匹配成功,“\w+?” 不得不匹配 “xxx” 才可以让后边的 “d” 匹配,从而使整个表达式匹配成功。因此,结果是:“\w+?” 匹配 “xxx”

在修饰匹配次数的特殊符号后再加上一个 “?” 号,则可以使匹配次数不定的表达式尽可能少
的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配”。这种匹配原则叫作 “非贪婪” 模式,
也叫作 “勉强” 模式。

反向引用

表达式后边的部分,可以引用前面 “括号内的子匹配已经匹配到的字符串”。引用方法是 “” 加上一个数字。“\1” 引用第 1 对括号内匹配到的字符串,“\2” 引用第 2 对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。也就是说,哪一对的左括号 “(” 在前,那这一对就先排序号。

表达式字符串匹配内容
('|")(.*?)(\1)‘Hello’, “World”" ‘Hello’ "。再次匹配下一个时,可以匹配到 " “World” "。
(\w)\1{4,}aa bbbb abcdefg ccccc 9999999“ccccc”。再次匹配下一个时,将得到9999999。这个表达式要求 “\w” 范围的字符至少重复 5 次

预搜索

正向预搜索

“(?=xxxxx)”,在被匹配的字符串中,它对所处的 “缝隙” 或者 “两头” 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 “\b”,本身不匹配任何字符。“\b” 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

“(?!xxxxx)”,所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

表达式字符串匹配内容
Windows (?=NT|XP)Windows 98, Windows NT, Windows 2000只匹配 “Windows NT” 中的 "Windows "
Windows (?!NT|XP)Windows 98, Windows NT, Windows XP只匹配 “Windows 98” 中的 "Windows "

反向预搜索

“(?<=xxxxx)”,"(?<!xxxxx)"这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 “左侧”,两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 “正向预搜索” 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

表达式字符串匹配内容
Windows (?<=NT|XP)Windows 98, Windows NT, Windows 2000只匹配 “Windows NT” 中的 "Windows "
Windows (?<!NT|XP)Windows 98, Windows NT, Windows XP只匹配 “Windows 98” 中的 "Windows "

其他通用规则

①表达式中,可以使用“\xXX”和“\uXXXX”表示一个字符(“X”表示一个十六进制数)。

表达式表示内容
\xXX编号在0~255范围内的字符
\uXXXX任何字符可以使用“\u”再加上其编号的4位十六进制数表示

②在表达式“\s”、“\d”、“\w”、“\b” 表示特殊意义的同时,对应的大写字符表示相反的意义。
③在表达式中有特殊意义,需要添加“\”才能匹配该字符本身的字符汇总,比如"^“,”$“,”()“,”[]“,”{}“,”.“,”?“,”+“,”*“,”|"这些特殊字符。
④括号“()”内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用“(?:xxxxx)”格式。
⑤常用的表达式属性设置简介

属性作用
Ignorecase默认情况下,表达式中的字符是要区分大小写的。配置为Ignorecase可使匹配时不区分大小写。
Singleline默认情况下,小数点“.”匹配除了换行符(\n)以外的字符。配置为Singleline可使小数点可匹配包括换行符在内的所有字符。
Multiline默认情况下,表达式“^”和“$”只匹配字符串的开始和结尾位置。配置为Multiline可以使“^”还可以匹配换行符之后,下一行开始前的位置,使“$”还可以匹配换行符之前,一行结束的位置
Global主要在将表达式用来替换时起作用,配置为Global表示替换所有的匹配

使用提示

  • 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用“^”和“$”
  • 如果要求匹配的内容是一个完整的单词,而不是单词的一部分,那么在表达式首尾使用“\b”
  • 表达式不要匹配空字符串,否则会一直得到匹配成功,而结果什么都没有匹配到
  • 能匹配空字符串的子匹配不要循环无限次
  • 合理选择贪婪模式与非贪婪模式
  • 或“|”的左右两边,对某个字符最好只有一边可以匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南北(✪▽✪)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值