正则简介

什么是正则

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

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

为什么要学习正则

基于现实场景的应用需要;文本的复杂处理;正则表达式是一种强大而灵活的文本处理工具,提供了一种紧凑的、动态的方式,能够以一种完全通用的方式来解决各种字符串处理(例如:验证、查找、替换等)问题;大部分语言、数据库都支持正则表达式

在前面的QX相关一些介绍中,无论是规则分流也好,重写也好,资源解析器中都多次的提到正则,那么学习一点基本的正则,对于更好的使用QX是十分有必要的。

表达式即条件

字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索.doc。在这里,会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。

表达式条件(规则)的字符表达;

正则表达式作用图示

示例

正则表达式描述

hello

匹配 {hello}

gray|grey

匹配 {gray, grey}

gr(a|e)y

匹配 {gray, grey}

gr[ae]y

匹配 {gray, grey}

b[aeiou]bble

匹配 {babble, bebble, bibble, bobble, bubble}

[b-chm-pP]at|ot

匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot}

colou?r

匹配 {color, colour}

rege(x(es)?|xps?)

匹配 {regex, regexes, regexp, regexps}

go*gle

匹配 {ggle, gogle, google, gooogle, goooogle, ...}

go+gle

匹配 {gogle, google, gooogle, goooogle, ...}

g(oog)+le

匹配 {google, googoogle, googoogoogle, googoogoogoogle, ...}

z{3}

匹配 {zzz}

z{3,6}

匹配 {zzz, zzzz, zzzzz, zzzzzz}

z{3,}

匹配 {zzz, zzzz, zzzzz, ...}

[Bb]rainf\*\*k

匹配 {Brainfk, brainfk}

\d

匹配 {0,1,2,3,4,5,6,7,8,9}

1\d{10}

匹配 11 个数字,以 1 开头

[2-9]|[12]\d|3[0-6]

匹配 2 到 36 范围内的整数

Hello\nworld

匹配 Hello 后跟换行符,后跟 world

\d+(\.\d\d)?

包含一个正整数或包含两位小数位的浮点数。

[^*@#]

排除 *、@ 、# 三个特色符号

//[^\r\n]*[\r\n]

匹配 // 开头的注释

^dog

匹配以 "dog" 开始

dog$

匹配以 "dog" 结尾

^dog$

is exactly "dog"

正则表达式在线测试工具

正则语法

来源:正则语法

语法含义

^

匹配字符串的开始

$

匹配字符串的结束

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

\b

匹配单词的开始或结束

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次


懒惰限定符

语法含义

*?

重复任意次,但尽可能少重复

+?

重复1次或更多次,但尽可能少重复

??

重复0次或1次,但尽可能少重复

{n,m}?

重复n到m次,但尽可能少重复

{n,}?

重复n次以上,但尽可能少重复

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符


常用分组语法

捕获

语法含义

(exp)

匹配exp,并捕获文本到自动命名的组里

(?<name>exp)

匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

(?:exp)

匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

语法含义

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp后面的位置

(?!exp)

匹配后面跟的不是exp的位置

(?<!exp)

匹配前面不是exp的位置

注释

这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

- 不用\-

去掉*的注释 ^(?!\s*\*/)\s*\*[^\r]*

去掉//单行注释 (?<!:)//.* (?<!http:)//.* //(?!www)[^\n]*

去掉/**/的注释 /\*[^*]+\*/

去掉所有//和#的注释 (?<!:)(//|\#).*

去掉空行 \n

格式调整去除前面的空格用: ^\s*

匹配带有某个词的行 .*keyword.*

网址域名带有某个关键词的 (^|\.)\w*keyword\w*\.\w*$

简单的IP地址匹配 (\d{1,3}\.){3}\d{1,3}


其他

校验数字的表达式

含义语法

数字

^[0-9]*$

n位的数字

^\d{n}$

至少n位的数字

^\d{n,}$

m-n位的数字

^\d{m,n}$

零和非零开头的数字

^(0|[1-9][0-9]*)$

非零开头的最多带两位小数的数字

^([1-9][0-9]*)+(.[0-9]{1,2})?$

带1-2位小数的正数或负数

^(\-)?\d+(\.\d{1,2})?$

正数、负数、和小数

^(\-|\+)?\d+(\.\d+)?$

有两位小数的正实数

^[0-9]+(.[0-9]{2})?$

有1~3位小数的正实数

^[0-9]+(.[0-9]{1,3})?$

非零的正整数

^[1-9]\d*$^([1-9][0-9]*){1,3}$^\+?[1-9][0-9]*$

非零的负整数

^\-[1-9][]0-9"*$^-[1-9]\d*$

非负整数

^\d+$^[1-9]\d*|0$

非正整数

^-[1-9]\d*|0$^((-\d+)|(0+))$

非负浮点数

^\d+(\.\d+)?$^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数

^((-\d+(\.\d+)?)|(0+(\.0+)?))$^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

正浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

负浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

浮点数

^(-?\d+)(\.\d+)?$^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

含义语法

汉字

^[\u4e00-\u9fa5]{0,}$

英文和数字

^[A-Za-z0-9]+$^[A-Za-z0-9]{4,40}$

长度为3-20的所有字符

^.{3,20}$

由26个英文字母组成的字符串

^[A-Za-z]+$

由26个大写英文字母组成的字符串

^[A-Z]+$

由26个小写英文字母组成的字符串

^[a-z]+$

由数字和26个英文字母组成的字符串

^[A-Za-z0-9]+$

由数字、26个英文字母或者下划线组成的字符串

^\w+$^\w{3,20}$

中文、英文、数字包括下划线

^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字但不包括下划线等符号

^[\u4E00-\u9FA5A-Za-z0-9]+$^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

可以输入含有^%&',;=?$"等字符

[^%&',;=?$\x22]+

禁止输入含有~的字符

[^~\x22]+

特殊需求表达式

Email地址

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

域名

[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

InternetURL

[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码

^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)

^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

国内电话号码(0511-4405222、021-87888822)

\d{3}-\d{8}|\d{4}-\d{7}

身份证号(15位、18位数字)

^\d{15}|\d{18}$

短身份证号码(数字、字母x结尾)

^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)

^[a-zA-Z]\w{5,17}$

强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

日期格式

^\d{4}-\d{1,2}-\d{1,2}

一年的12个月(01~09和1~12)

^(0?[1-9]|1[0-2])$

一个月的31天(01~09和1~31)

^((0?[1-9])|((1|2)[0-9])|30|31)$

钱的输入格式:

  1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$

  2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$

  3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

  4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

  5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$

  6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

  7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

  8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

xml文件

^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

中文字符的正则表达式

[\u4e00-\u9fa5]

双字节字符(包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

[^\x00-\xff] 

空白行的正则表达式(可以用来删除空白行)

\n\s*\r 

HTML标记的正则表达式(网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

<(\S*?)[^>]*>.*?</\1>|<.*? />

首尾空白字符的正则表达式(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

^\s*|\s*$或(^\s*)|(\s*$) 

腾讯QQ号(腾讯QQ号从10000开始)

[1-9][0-9]{4,} 

中国邮政编码 (中国邮政编码为6位数字)

[1-9]\d{5}(?!\d)

IP地址(提取IP地址时有用)

\d+\.\d+\.\d+\.\d+ 

IP地址:

((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

常用节点正则筛选表达式

Author: @iKeLee

❤️ 简单正则说明

如下,匹配以“http”开头的整行字符串

^http.*$

如下匹配任意含http的整行

^.*http.*$

以上,^ 符号的意思为从行首第一个字符开始匹配;而 .*$ 符号则表示匹配整行,不含双引号。

❤️ 简单正则例子

A或者B

^.*(A|B)

有A有B

(A.*B|B.*A)

不含A

^(?!.*A)

有A但不含B

^(?!.*?B).*A

A和B同时有

(?=.*A)(?=.*B)

包含A、B、C的同时排除A、B、C和D、E、F各自互相组合的情况

^(?=.*A|B|C)(?!.*D|E|F).*$

❤️ Netflix 专用地区节点

Netflix 香港节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇭🇰|香港|(\b(HK|Hong)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

Netflix 台湾节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇹🇼|台湾|(\b(TW|Tai|Taiwan)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

Netflix 日本节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇯🇵|日本|川日|东京|大阪|泉日|埼玉|(\b(JP|Japan)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

Netflix 韩国节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇰🇷|韩国|韓|首尔|(\b(KR|Korea)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

Netflix 新加坡节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇸🇬|新加坡|狮|(\b(SG|Singapore)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

Netflix 美国节点

^(?=.*((?i)(\b(Netflix|NF|GPT)\b)|原生|家宽|解锁))(?=.*((?i)🇺🇸美国|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|(\b(US|United States)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

❤️ 地区节点

游戏节点

^(?=.*((?i)游戏|🎮|(\b(GAME)\d{0,2}\b)))(?!.*((?i)回国|校园)).*$

回国节点

^(?=.*(回国))(?!.*((?i)校园|游戏|🎮|(\b(GAME)\b))).*$

全球节点

^(?=.*(.*))(?!.*((?i)邀请|返利|循环|官网|客服|网站|网址|获取|订阅|流量|到期|机场|下次|版本|官址|备用|到期|过期|已用|联系|邮箱|工单|群|贩卖|通知|倒卖|防止|国内|🎮|(\b(GAME|USE|USED|TOTAL|EXPIRE|EMAIL|Panel)\d{0,2}\b|(\d{4}-\d{2}-\d{2}|\dG)))).*$

不含港台日韩新美的节点

^(?=.*(.*))(?!.*((?i)🇭🇰|🇹🇼|🇯🇵|🇰🇷|🇸🇬|🇺🇸|香港|台湾|日本|川日|东京|大阪|泉日|埼玉|韩国|韓|首尔|新加坡|狮|美国|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|邀请|返利|循环|官网|客服|网站|网址|获取|订阅|流量|到期|机场|下次|版本|官址|备用|到期|过期|已用|联系|邮箱|工单|群|贩卖|通知|倒卖|防止|国内|🎮|(\b(HK|Hong|TW|Tai|Taiwan|JP|Japan|KR|Korea|SG|Singapore|US|United States|GAME|USE|USED|TOTAL|EXPIRE|EMAIL|Panel)\d{0,2}\b|(\d{4}-\d{2}-\d{2}|\dG)))).*$

香港节点

^(?=.*((?i)🇭🇰|香港|(\b(HK|Hong)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

澳门节点

^(?=.*((?i)🇲🇴|澳门|(\b(MO|Oman)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

台湾节点

^(?=.*((?i)🇹🇼|台湾|(\b(TW|Tai|Taiwan)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

日本节点

^(?=.*((?i)🇯🇵|日本|川日|东京|大阪|泉日|埼玉|(\b(JP|Japan)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

韩国节点

^(?=.*((?i)🇰🇷|韩国|韓|首尔|(\b(KR|Korea)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

新加坡节点

^(?=.*((?i)🇸🇬|新加坡|狮|(\b(SG|Singapore)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

美国节点

^(?=.*((?i)🇺🇸|美国|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|(\b(US|United States)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

加拿大节点

^(?=.*((?i)🇨🇦|加拿大|(\b(CA|Canada)\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

俄罗斯节点

^(?=.*((?i)🇷🇺|俄罗斯|莫斯科|新西伯利亚|(\b(Новосиби́рская|Moscow|RU|Russia)\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

英国节点

^(?=.*((?i)🇬🇧|英国|伦敦|(\b(UK|United Kingdom)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

印度节点

^(?=.*((?i)🇮🇳|印度|班加罗尔|孟买|(\b(Mumbai|IN|India)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

阿根廷节点

^(?=.*((?i)🇦🇷|阿根廷|(\b(AR|Argentinaia)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

土耳其节点

^(?=.*((?i)🇹🇷|土耳其|(\b(TR|TUR|Turkey)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

德国节点

^(?=.*((?i)🇩🇪|德国|(\b(DE|Germany)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

荷兰节点

^(?=.*((?i)🇳🇱|荷兰|(\b(NL|Holland|Netherlands)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

澳大利亚节点

^(?=.*((?i)🇦🇺|澳大利亚|(\b(AU|Australia)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

南非节点

^(?=.*((?i)🇿🇦|南非|(\b(ZA|South Africa)\d{0,2}\b)))(?!.*((?i)回国|校园|游戏|🎮|(\b(GAME)\b))).*$

最后更新于