正则表达式

熵桥流沙
• 阅读 2170

预定义字符类

.(点好): 匹配除了换行符和其他Unicode行终止符(如回车符)之外的任意字符,等价于[^\n\r]
\w: 匹配任何ASII单字字符,等价于[a-zA-Z0-9_]
\W: 匹配任何非ASII单字字符,等价于[^a-zA-Z0-9_]
\s: 匹配任何Unicode空白符,等价于[\t\n\x0B\f\r]

贪婪匹配

概念:如星号(*)元字符在执行匹配时,先看整个字符串是否匹配,如果不匹配则去掉该字符串中的最后一个字符,并再次尝试。

1.?、{n}和{n,m}重复类

这三个都具有弱贪婪性,主要表现在贪婪性具有有限性。对于?匹配,在选择匹配还是不匹配时,如果条件允许,它总是会选择匹配而不是不匹配;{n,m}在条件允许的情况下,匹配m次,而不是n次。
正则式的贪婪性是在遵循匹配条件基础上尽可能占有更多的字符,而不是随意占用。

2.*、+和{n,}重复类

这三个具有强贪婪性,这种贪婪表现为贪婪的无限性

  • 星号(*)重复类的匹配底线是最宽容的,匹配欲望是最强烈的。不管是否存在指定字符或子表达式都会执行匹配操作

  • 加号(+)重复类的匹配底线是最少存在一个符合指定条件的字符或子表达式,否则不予执行匹配操作

  • {n,}重复类的匹配底线是最灵活的,执行任意底线和条件的无限贪婪的匹配操作。

正则表达式是有贪婪性的,它总是与最长的长度匹配,而且越是排在左侧的重复类匹配符优先级就越高。

var s = "<html><head><title></title></head><body></body></html>";
var r = /(<.*>)(<.*>)/
var a = s.match(r);
alert(a[1])//<html><head><title></title></head><body></body>
alert(a[2])//</html>

上面的演示说明,当多个重复类并列子在一起时,左侧重复类具有较大的优先权,并尽可能的占有更多的符合条件的字符。

惰性匹配

惰性匹配它将先查看字符串中的第一个字符是否匹配,如果匹配条件不够,就读入下一个字符。如果还是匹配不足够,惰性匹配会继续从字符串中读取字符串直到发现匹配或者整个字符串都检查过也没有匹配为止。惰性匹配只需要在重复类后面添加问号(?)就可以了。问号必须放在重复字符串后面。
贪婪匹配体现了最大化匹配原则,那么惰性匹配体现了最小化匹配原则。但不管是那种匹配都必须保证匹配满足正则表达式基本条件。

  • {n,m}?: 正则表达式尽量匹配n次,但是为了满足匹配条件也可能最多重复m次

  • {n}?: 正则表达式尽量匹配n次;

  • {n,}?: 尽量匹配n次,但为了满足匹配条件也可能匹配任意次

  • ??: 正则表达式尽量匹配,但是为了满足匹配条件也可能多次匹配1次,相当于{0,1}?

  • +?: 尽量匹配1次,但是为了满足匹配条件也可能匹配任意次数,相当于{1,}?

  • *?:相当于{0,}?

支配匹配(浏览器兼容不强)

这个是另一种类型的匹配模式,它的算法是:只匹配整个字符串。如果整个字符串不能匹配,则会自动放弃匹配,不再执行迭代以求进一步尝试。支配匹配只需要在重复类后面添加加号(+)即可。

高级匹配模式

1.分组:就是通过用小括号来包含一系列字符、字符类,或者重复类量词,以实现处理各种特殊的字符序列
通过小括号逻辑分隔符,实现分别储存每个被匹配的标签,最后通过这个数组类获取每个标签的名称。小括号表示一个独立的逻辑域,其匹配的内容将被独立存储。
分组的应用价值

  • 把单独的项目进行分组,以便合成子表达式,这样就可以像处理yi个独立的字符那样,使用|、+、*或?等字符来处理他们。

  • 在正则表达式中,通过分组可以在一个完整的模式中定义子模式。当一个正在表达式成功地与目标字符串匹配时,也可以从目标字符串中抽出与小括号中的子模式相匹配的部分。

var s = "ab=21,bc=45,cd=43";
var r = /(\w+)=(\d+)/;
var a = s.match(r); ["ab=21","ab","21"]
  • 在同一个正则表达式的后部分可以引用前面的子表达式。这是通过在字符“”后加一位或多位数字实现的。数字指定了带括号的子表达式在正则表达式中的位置

var s = "<h1>title</h1><p>text</p>"
var r = /(<\/?\w+>).*\1/g;
var a = s.match(r);//["<h1>title</h1>","<p>text</p>"]

非引用型分组

正则表达式分组会占用一定的系统资源,在较长的正则表达式中,存储反向引用会降低匹配速度。创建非引用型分组的方法是,在括号的后面分别加上一个问号和冒号。(?:w*?)

声明

正则表达式用来声明正则表达式在什么条件下才能匹配,或者不在什么条件下才会匹配,这种声明包括正前向声明和反向前声明两种模式

  • 正前向声明是指匹配模式后面的字符,声明表示条件的意思,也是指定在接下来的字符必须被匹配,但并不真正进行匹配。通俗的讲,就是指定可能执行匹配操作的条件,该条件作为正则表达式的匹配模式一部分而存在,但是不会真正使用该条件去执行匹配。

var s = "a:123 b=345";
var r = /\w*(?==)/;
var a = s.match(r);//["b"]
  • 反前向声明,就是指定接下来的字符都不必匹配,反前向声明使用“(?!匹配条件)”来表示

var s = "a:123 b=345";
var r = /\w*(?!=)/;
var a = s.match(r);//['a']

静态

正则表达式

var s = "JavaScript, not Javascript";
var r = /(Java)Script/gi;
var a = r.exec(s);
RegExp.input//"JavaScript, not Javascript"
RegExp.leftContext//空字符串
RegExp.rightContext//", not Javascript"
RegExp.lastMatch//"JavaScript"
RegExp.lastParen//"Java"
点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
半臻 半臻
4年前
Python基础11——正则表达式
19正则表达式19.1正则基础正则表达式:字符串处理工具应用场景1.html查询2.验证字符串是否符合规则re模块match方法python通过正则表达式对字符串进行匹配importre使用match方法进行匹配操作re.match()从字符串的开始位置进行匹配,匹配成功,返回match对象。匹配失败,返回Noneresre
Kubrnete Kubrnete
4年前
Python正则表达式
re正则表达式基础语法|表达式|可匹配|表达式|可匹配|||||||\r,\n|代表回车和换行符|\^|可匹配^本身||\t|制表符|\$|匹配$符号本身||\\|代表“\”本身|\.|匹配小数点“.”本身||表达式|可匹配|||||\d|任意一个数字,09中的任意一个||\
Wesley13 Wesley13
4年前
java正则表达式
Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点)1     英文句点符号:匹配单个任意字符。eg:表达式”t。o 可以匹配:tno,to,teo等等。不可以匹配:tnno,to,Tno,t正o等。2     方括号:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。eg:表达式:t\ab
Wesley13 Wesley13
4年前
android 正则检测用户名 密码 邮箱
最常用的几个正则匹配://用户名:315任意字符组合usernameRegex/^\\w{3,15}$/;//密码:612任意字符组合passwordRegex/^\\w{6,12}$/;//邮箱:自己实现验证规则emailRegex/^\\w@\\w(\\.\\w)$/;//真实
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
4年前
2019 力扣杯
给出长度相同的两个字符串:A 和 B,其中A\i\和B\i\是一组等价字符。举个例子,如果 A"abc" 且 B"cde",那么就有 'a''c','b''d','c''e'。等价字符遵循任何等价关系的一般规则:自反性:'a''a'对称性:'a'
Wesley13 Wesley13
4年前
MYSQL正则表达式
MySQL中使用REGEXP操作符来进行正则表达式匹配。下表中的正则模式可应用于REGEXP操作符中。模式描述^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配'\\n'或'\\r'之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Mul
Stella981 Stella981
4年前
Python 正则表达式规则
正则表达式的一些匹配规则:.:用于匹配任意一个字符,如a.c可以匹配abc、aac、akc等^:用于匹配以...开头的字符,如^abc可以匹配abcde、abcc、abcak等$:用于匹配以...结尾的字符,如abc$可以匹配xxxabc、123abc等\:匹配前一个字符零次或多次,如abc
Stella981 Stella981
4年前
Golang中的正则表达式
Golang中的正则表达式【用法】单一:.匹配任意一个字符,如果设置strue,则可以匹配换行符字符类匹配“字符类”中的一个字符,“字符类”见后面的说明^字符类匹配“字符类”外的一个字符
Stella981 Stella981
4年前
Linux文本处理常用命令
1.正则表达式(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符az)以及特殊字符(称为元字符,如/、\、?等)组成。(2)基本元字符集及其含义^:只匹配行首。 如^a匹配以a开头的行abc,a2e,a12,aaa,......$:只匹配行尾。 如^a匹配以a结尾的行bca,12a,