正则表达式,看着一篇就够了

本贴最后更新于 1569 天前,其中的信息可能已经事过境迁

正则表达式

1、介绍

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

2、特殊字符

所谓特殊字符,就是一些有特殊含义的字符, 比如:*字符它表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个\斜杠,\*。

特别字符 描述
$ 匹配输入行尾。
^ 匹配输入字行首。
\ 将下一个字符标记符、或一个向后引用、或一个八进制转义。
例如,“\\n”匹配\n。“\n”匹配换行符。
| 将两个匹配条件进行逻辑“或”(or)运算。
() 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到
一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
{ 标记限定符表(数量词)达式的开始。
[ 标记一个中括号表达式的开始。

特殊字符小知识点:

1. ()代表组也可以叫分组,什么是分组,是什么时候用到分组呢?
	a、什么是分组:()里面的是一个子表达式是一个整体,()内的规则只对内有效,括号外的规则作用于整个()。
	比如:do(es)?,这里表示可看做:d、o、es三个组合在一起,其中es是一个整体,?只作用(es)整体,
	不单作用s也不作用d和o。
	b、什么时候用分组:匹配相同范围内的不同值。例如:需要同时匹配gmail、163、sina的邮箱地址。gmail、
    163、sina他们都是属于邮箱的后缀。
	表达式:\w{4,20}@(gmail|163|sina)\.com :单词字符4-20个,一个@,gmail、163、sina
	分组中任意一个,最后一个.com。
	如果在这里不加上(),\w{4,20}@gmail|163|sina\.com,那么|的范围不在是()分组内,
	而是整个表达式。sina\.com被看做一个整体。
2. \num 引用分组中的内容
	当我们需要匹配相同内容时,分组为了我提供了一个中方便的引用方式\num。
	例如:<A>柠檬班</A>,<A>和</A>A内容是一样的,所以可以使用\num来改进。
	<([a-zA-Z]*)>[\u4e00-\u9fa5]+</\1>:([a-zA-Z]*)是第一个组,\1就能引用,
	所以</\1>相当于</([a-zA-Z]*)>

3、限定符(数量词)

字符 描述
* 匹配前面的子表达式任意次。例如,zo* 能匹配“za”,也能匹配“zo”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式至少一次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "za"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。请注意在逗号和两个数之间不能有空格。

数量词小知识点:

数量词匹配的是前面的子表达式,那么什么是子表达式呢?
比如:zo*,星号作用的只有o单个字符,和z没有任何关系。所以zo*匹配的是:一个z和任意个o。
比如:do(es)?,问号作用的(es)这个分组,所以do(es)?匹配的是:一个d和一个o和零个和一个es。

4、预定义字符类

字符 描述
\d 数字:[0-9]
\D 非数字: [ ^ 0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[ ^ \s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[ ^\w]
. 匹配除“\n”和"\r"之外的任何单个字符。
1 操作
luojie 在 2020-08-06 17:35:00 更新了该帖
1 回帖
请输入回帖内容 ...