14 moss 10个月前 411次点击
以下内容是我个人在正则表达式说明里面翻出来的,其中里面有个人领悟何从其他小伙伴那收集过来的。,希望大家能看懂。
ts:(若有侵权,请联系删除)
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。通过正则表达式,我们可以完成一些高级的文本替换。
个人前言
学习这个之前,我想我们有必要先认识符号:
ts:表达式中涉及到的符号必须为英文符号,所有涉及到正则表达式的内容建议大家使用字符进行浏览,避免符号漏读,导致表示式错误。
(.+)
它可匹配任意字符
()它在正则表达式里面的作用有两种:
一种叫做分组,大概的意思是将表达式的一部分括在括号中,把括号内的看作是一个整体来处理;
另一种叫做捕获组,补货组的意思后续有解释。
$1
$2
$3
……
$符号是一个判断的标志,数字1代表第一个可变化的内容,如果在替换的文本中定义了多个可变化的内容,使用$1$2$3从左往右依次递增即可。
精确匹配当中
\d
匹配一个数字
\w
匹配一个字母或数字
.
匹配任意字符(不包括换行服)
在匹配变长的字符时
*
表示任意个字符
+
表示至少一个字符,
?
表示0个或1个字符,
{n}
表示n个字符,
{n,m}
表示n-m个字符
{}是用于指定匹配次数的量词元字符。它可以用来表示匹配的次数范围或精确匹配次数
\s
可以匹配一个空格
其它
[]
表示范围
|
它的意思就是或。
如:A|B可以匹配A或B
$
$表示行的结束,\d$表示必须以数字结束(其它的如上)。
^表示行的开头,^\d表示必须以数字开头(其它的如上)。
一:简单的使用方式:
以微信聊天中“与 用户昵称 的聊天”为例,开头的“与”和结尾的“的聊天”为固定文本,而中间的用户昵称是会随着你进入不同的聊天会话界面而变化的,那么我们如何通过正则表达式来匹配呢?以下为具体的表示式:
与(.+)的聊天
核心就是当中的(.+),它的涵义是代表任意字符,言外之意它可以匹配任意字符,所以大家只要简单的记住这串字符,就可以用在自己想要替换的文本当中。例如在鸿蒙系统桌面上,会提示”应用名称,双指上滑显示服务卡片“,我们可以通过以下表达式进行匹配:
(.+)双指上滑显示服务卡片
上方的表达式即匹配了华为桌面双指上滑显示服务卡片的文本。上述两个例子我们需要的都是将变化的内容保留,将固定的内容剔除,所以在替换后的文本当中自然就无法使用固定的文本内容进行替换了。那么我们如何来表示替换的结果呢?其实也很简单,将下方的字符填入替换后的文本即可:
$1
简单的理解,$符号是一个判断的标志,数字1代表第一个可变化的内容,两个例子当中都只有一个可变化的内容,所以用$1表示即可,如果在替换的文本中定义了多个可变化的内容,使用$1$2$3从左往右依次递增即可。
综上:在替换文本的编辑框中使用(.+)代表任意字符,在替换后的文本编辑框中使用$1或者固定的文本表示替换后的内容。
例如第一个编辑框输入
(.+)双指上滑显示服务卡片
第2个编辑框输入
$1a
那么在桌面上朗读天坦读屏就会独成:
天坦读屏a
当然我们不会这样替换,我们主要的目的是让桌面更加简洁,所以$1后面就不用写东西了。
二:正则表达式基本知识:
捕货组:
这个可以理解为括号内的字符,例如:
(.+)双指上滑查看服务卡片
括号内的表示需要保留,括号外面的文字则表示需要过滤掉,可以把括号内的内容看作是捕获组,如果一段文本是微信双指上滑查看服务卡片,那么(.+)这个捕获组,可以用来表示微信这两个字需要保留,在括号的外面写上不需要的文本,比如双指上滑查看服务卡片,保存之后就可以将后面的文本过滤掉。
1. 如果直接给出字符,就是精确匹配。:
用
\d
可以匹配一个数字
用
\w
可以匹配一个字母或数字
用
.
可以匹配任意字符
所以:
'00\d'可以匹配'007',但无法匹配'00A';
'\d\d\d'可以匹配'010';
'\w\w\d'可以匹配'py3';
'py.'可以匹配'pyc'、'pyo'、'py!'等等; 引用标记。这一句我没理解。
2. 要匹配变长的字符:
用
*
表示任意个字符
(包括0个),
用
+
表示至少一个字符,
用
?
表示0个或1个字符,
用
{n}
表示n个字符,
例如说:\d{3} 可以匹配3个数字
用
{n,m}
表示n-m个字符
例如说: \d{3,8} 可以匹配3-8个数字
{}是用于指定匹配次数的量词元字符。它可以用来表示匹配的次数范围或精确匹配次数,具体来说:
a{3}:匹配连续三个“a”字符。
b{2,4}:匹配连续两个到四个“b”字符。
(0-9){3}:匹配连续三个数字字符。
来看一个复杂的例子:\d{3}\s+\d{3,8},我们来从左到右解读一下:
1.\d{3}表示匹配3个数字,例如'010';
2.\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' ',' '等;
3.\d{3,8}表示3-8个数字,例如'1234567'。 引用标记
综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。
如果要匹配'010-12345'这样的号码呢?由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{3}\-\d{3,8}。
但是,仍然无法匹配'010 - 12345',因为带有空格。所以我们需要更复杂的匹配方式。
三:进阶:
ts:这边我很多都没有看懂,以后有时间慢慢研究。
要做更精确地匹配,可以用[]表示范围,比如:
[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串,比如
'a100',
'0_Z',
'Py3000'
[a-zA-Z\_][0-9a-zA-Z\_]*
可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束。
你可能注意到了,py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。
这些符号类似解说的代码符号,但是比解说的那个复杂的多