正则语法大全
正则语法大全语法正则表达式语法
http://www.regexlab.com/zh/deelx/syntax.htm
匹配一个空白行。
/\d{2}-\d{5}/
"\d{2}-\d{5}"
验证一个id 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/<(.)>.</\1>/
"<(.)>.</\1>"
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, er\b 可以匹配"never" 中的 er,但不能匹配 "verb" 中的 er。
\b
匹配非单词边界。er\b 能匹配 "verb" 中的 er,但不能匹配 "never" 中的 er。
\cx
匹配由x指明的控制字符。例如, \cm 匹配一个 control-m 或回车符。 x 的值必须为 a-z 或 a-z 之一。否则,将 c 视为一个原义的 c 字符。
\d
匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\f
匹配一个换页符。等价于 \x0c 和 \cl。
\n
匹配一个换行符。等价于 \x0a 和 \cj。
\r
匹配一个回车符。等价于 \x0d 和 \cm。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\s
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \ci。
\v
匹配一个垂直制表符。等价于 \x0b 和 \ck。
\w
匹配包括下划线的任何单词字符。等价于[a-za-z0-9_]。
\w
匹配任何非单词字符。等价于 [^a-za-z0-9_]。
\xn
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, \x41 匹配 "a"。\x041 则等价于 \x04 & "1"。正则表达式中可以使用 ascii 编码。.
\num
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,(.)\1 匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm将匹配八进制转义值 nm。
\nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un
匹配 n,其中 n 是一个用四个十六进制数字表示的 unicode 字符。例如, \u00a9 匹配版权符号 (?)。
特殊声明
/i (忽略大小写)
/g (全文查找出现的所有匹配字符)
/m (多行查找)
/gi(全文查找、忽略大小写)
/ig(全文查找、忽略大小写)
固化分组和占有量词
匹配所有包括特殊
([\s\S])
([\d\D])
([\w\W]*)
可以匹配包括换行任意字符 效率来说不高
分组编号从 1 开始。0 代表整个表达式
分组类型:
捕获型 ()
非捕获型 (?:pattern)
正向前瞻型(零宽度正预测先行断言,也是非捕获型) (?=pattern)
反向前瞻型(零宽度负预测先行断言,也是非捕获型) (?!pattern)
固化分组(独立表达式 DEELX引擎的叫法,也是非捕获型) (?>pattern)
命名捕获组(<>或'') (?<名>)
固化分组(零宽度正回顾后发断言) (?<exp)
命名的捕获组同样也可以使用编号获取相应值 \k< name > 命名后向引用。
特殊的统称断言,当断言为真时才会继续
非捕获型分组是
不算做编号 不存内存 无值 在引用的时候无效
特殊情况
外层是捕获组 内部有非捕获组时 引用外层时 值依然会被存储 有值
外层是捕获组 内部有前瞻型分组时 只会捕获外层会排除前瞻型分组内层的值 外层有值 内层前瞻型分组无值
逻辑或(|分隔) 在替换时 引用分组值 只能被自己那边的分组引用替换 不能替换为另一边的分组引用值 一般多行模式
正反的意思 (预查 前瞻 断言等不管他叫什么)
正=必须包含该关键词,反之不能包含
不存储也不消耗字符(不吃) 所以可多个预查 一般用于多分组校验
条件判断
(?if then |else) 条件为真,则匹配then子表达式,否则匹配else子表达式
(?(backreference)true-regex)
(?(backreference)true-regex|false-regex)
括号里的backreference是一个回溯引用,是子表达式标号
true-regex是一个只有在backreference存在时才会被执行的子表达式
false-regex是一个只有在backreference不存在时才会被执行的子表达式
在条件表达式内 $0就是全部 第一个值是为真后后面的组
零长度断言
元字符(Metacharacter)
^ 行首
$ 行尾
\b 单词边界
\B 非单词边界
< 单词的起始位置
> 单词的结束位置
\A 字符串起始位置
\Z 字符串结束位置
\z 字符串结束位置
\G 本次匹配的起始位置或上次匹配的结束位置
(?=...) 如果右边能够匹配,则成功
(?!...) 如果右边不能够匹配,则成功
(?<=...) 如果左边能够匹配,则成功
(?<!...) 如果左边不能够匹配,则成功
特殊声明 (很多地方未必支持)
/i (忽略大小写) /gi(全文查找、忽略大小写)
/ig (全文查找、忽略大小写)
/m (多行查找)
/g (全文查找出现的所有匹配字符)
补充区域
循环次数
{3,3}可以简写成{3}
[0-9]{1,3}表示在0-9的范围里面循环1个、2个或者3个,可能结果有多个
正则表达式引擎DFA与NFA 正则原理篇 引擎
Nondeterministic Finite Automata/Deterministic Finite Automata
非确定有限自动状态机=NFA
确定有限自动状态机=DFA
好的性能总是在细微之间
NFA
a|a1
如 以上逻辑表达式
在运行到字符串尾部还没有找到那就结束了
若是具有逻辑 选择
先会优先前面的 直到搜索到目标a就会结束那么a1不可能有机会再被搜索,没有搜索到才会继续搜索a1,所以正则表达式这个顺序怎么写也很重要
NFA引擎明显的特点是 捕获型和回溯
DFA
DFA比NFA要快 但这个引擎截然不同 市面上用的也少
不支持非贪婪量词和捕获型括号
它快是因为不需要回溯 只搜索一遍
逻辑中 只取最长的 对顺序不敏感
优化经验 尽量避免回溯
我们应该把能够匹配最多字符的分支放在第一位 减少引擎回溯
如非必要 把星号替换成加号 合理地跟问号
正则表达式固化分组和占有量词
量词
所谓量词我理解为数量不简单的关键词 即要用重复数量的 不确定数量的
.* {2} + w*之类
正则原理篇2 固化分组和占有量词
有些环境不一定支持
固化分组和占有量词
一个是分组用
一个随便跟用
需要注意的是一旦表达式用了这个 按顺序执行时固化或占有匹配成功了 后面将会忽视 因为它吃了的不再归还(别管他吃不吃的 就是不遍历 成功与否都会结束)
共同特征:成功就吃掉
量词自身是贪心的 跟* 能回溯(代价高) =贪心量词
懒惰量词每次吃得不多 在普通量词后跟?问号 会重复尽可能少的次数
占有量词每次直接吃完 不会回溯 在普通量词后跟+加号
占有量词 (优先)
?+ *+ ++ {m,n}+
占有优先量词不交还已经匹配的字符
就是在量词后面跟一个加号
特点是:
它吃下的东西不会还,一旦成功 备用状态舍弃
固化分组
把回溯理解为遍历或N次遍历
(?>...)
分组开头是这个 其他无区别 一旦完成匹配就完成了 锁定状态,不能被回溯
分组其他可选分支就会无视,
若是固化分组匹配失败那后面的备选分支会继续执行搜索
所以最适合用在有与没有之间这个状况下且减少回溯
特点是:
与上面一样,可以不保存备用状态
(?>\w+):
优化经验
此解决方法可以有效提升性能
贪婪 非贪婪(?) 独占(+)
X? X?? X?+
X* X*? X*+
X+ X+? X++
X{n} X{n}? X{n}+
X{n,} X{n,}? X{n,}+
X{n,m} X{n,m}? X{n,m}+
占有量词形式 //+跟着
?+ 占有式匹配零次或一次
++ 占有式匹配 一次或多次
*+ 占有式匹配零次或多次
{n}+ 占有式匹配n次
{n,}+ 占有式匹配n次或更多次
{m,n}+ 占有式匹配匹配m至n次
占有匹配没有回溯
懒惰量词形式 //?跟着
?? 懒惰匹配零次或一次
+? 懒惰匹配一次或多次
*? 懒惰匹配零次或多次
{n}? 懒惰匹配n次
{n,}? 懒惰匹配n次或多次
{m,n}? 懒惰匹配m至n次
特定次数形式 //{}内设置
使用花括号可以限制某个模式在某个范围内匹配的次数,未经修饰的量词就是贪心量词。
范围语法总结:
{n} : 精确匹配n次
{n,} :匹配n次或更多次
{m,n} :匹配m至n次
{0,1} :匹配零次或一次(与?相同)
{1,0} :匹配一次或更多次(与+相同)
{0,} :匹配零次或更多次(与*相同)
正则匹配素数的表达式深入探讨
素数(正则匹配素数的表达式深入探讨)
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
质数的个数是无穷的
质数只有两个正因数(1和自己)的自然数即为质数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的作用。
质数的分布规律是以36N(N+1)为单位,随着N的增大,素数的个数以波浪形式渐渐增多。
孪生质数也有相同的分布规律。
此话题来源于群内问题
【活跃】简易释矢一 2020/11/19 14:50:38素数应该无法正则匹配吧。。。要是能正则匹配,岂不是表达式都能写了?
【活跃】凤凰涅檠 2020/11/19 14:51:01素数貌似可以
【活跃】╭☆缘ǒゞ 2020/11/19 14:51:13素数可以的,早就有了
【话唠】伍拾步 2020/11/19 14:51:30^(?!(..+)\1+$)
【话唠】伍拾步 2020/11/19 14:59:13非合数就是素数
【话唠】伍拾步 2020/11/19 15:07:39所谓合数,就是能分解成m×n的数。换成这里的说法,就是由 m 长度的 x 重复 n 次。m = 2,3,4,.... n = 2,3,4,....
【传说】超级飞侠 2020/11/19 15:02:18x*y==m
x>=2y>=2【话唠】laserw9小巫师 2020/11/19 15:01:11^(..+)(\1)+$
这个就是合数的
【话唠】伍拾步 2020/11/19 15:08:10(..+)就是m,\1+就是n
(..+) 里的第一个点开始运行,已占据一位,第二个点因为右边是 + 表示它可以至少是1最多无限,所以合起来就是这个括号里最少匹配2位
此时这两位被记录到分组1中
\1 表示取分组1 同样的值,也就使得长度至少翻了一倍
而 \1 后面的 + 表示 这个翻倍可以继续增长,翻2倍、3倍、4倍... 直到匹配到 $
左边的 (..+) 表示位数从 2 开始增长,往后是 3、4、5、6、7、8、9....
这就是它的运作原理
【话唠】laserw9小巫师 2020/11/19 15:12:39换个名字更清晰些:
len * nlen:(..+)n:\1+
开头的 ^ 和结尾的 $ 是让引擎能在不符合 len * n 正好等于整行字符串的长度时回溯,更新 len 和 n 的值进行测试,当所有 len 和 n 的情况都测试完毕,还不存在,那就是素数长度了
一种使用正则表达式检查数字是否为质数的疯狂方法
https://itnext.io/a-wild-way-to-check-if-a-number-is-prime-using-a-regular-expression-4edfb725f895
正则表达式案例解析学习
--量词优先1位数字匹配这是因为前面限制所致 点※限制了几乎所有字符串
但因为后面还有子表达式所以还必须吐出来满足后面
但因后面只需要一个数字所以只吐出一个就完成了
这里的关键在于+号 是限定符及量词
^.*([0-9]+)
数据:
群里都是9095后的吧.
All of them are born 9095公安备案号11010502030143京ICP备19004658号
京网文〔2020〕1039-165号
网络110报警服务
©1999-2020北京创新
结果:9其他行也是一样 只有一位数字
后者显示行内所有数字
([0-9]+)
数据依然如上结果会显示所有数字
前面没有约束的情况下则显示所有数字