正则表达式

如题所述

第1个回答  2022-07-30

regular expression是计算机科学中的一个概念。正则表达式使用单个字符串来描述匹配一系列符合某个句法规则的字符串。

g全文搜索,i忽略大小写,m多行搜索

具有特殊意义的专用字符,用来规定其前导字符
( [ { \ ^ $ | ) ? * + .
不同组合中的元字符有不同的意义,举例

可以使用[]来构建一个简单的类
var reg = /[abc123]/;
创建一个单字符的类,代表这个字符可以是a,可以是b,可以是c,可以是1,...可以是3。

可以使用^来进行取反,
var reg = /[^abc123]/;
代表着这个单字符可以是任何其他的单字符,除了a,b,c,1,2,3之外。

如果要匹配单个字符,让单字符只能取数字的话,可以使用字符类
写成:
var reg = /[0123456789]/;
这么写比较麻烦,所以可以使用范围类,我们可以使用x-y来连接两个字符,表示从x到y的任意字符,是个 闭区间 ,意味着 包含x和y本身 ,这样,我们要匹配单个数字就可以写成:
var reg2 = /[0-9]/;
要匹配所以的单个字母,可以写为
var reg3 = /[a-zA-Z]/;

上面创建了一些类,用来表示数组,字母等。但是这么写也比较麻烦,正则表达式提供了几个常见的预定义类来匹配常见的字符

有了这些预定义类,写一些正则就比较方便了,比如我们希望匹配一个ab+数字+任意字符的字符串,就可以写作:
var reg = /ab\d./;

正则表达式还提供了几个常用的边界匹配字符

^如果不写在[]内的话,不代表取反,代表以xxx开头,例如: var reg = /hello/; 代表以hello开头,相应的也有$表示为以xxx结尾,举例说明:

单词边界

之前写的方法都是一一匹配的,但是如果希望匹配一个连续出现很多次的字符,例如数字的字符串,不需要写成 \d\d\d\d ,我们可以使用量词

使用举例:

上面提到的{n,m},如果出现多次,只要是n-m中的值都满足条件,到底是按照n还是m来匹配。 量词在默认条件下是尽可能多的匹配的,即默认贪婪模式
var reg = /\d{3,5}/g; '123456789'.match(reg); //{"12345","6789"}

与贪婪模式相对的,就有非贪婪模式,即尽可能少的匹配,一旦成功匹配之后不再继续尝试,在后面加上?即可
var reg2 = /\d{3,5}?/g; '123456789'.match(reg); //{"12345","6789"}

上面的量词解决的是单个字符重复多次的问题,如果我们需要匹配重复的多个字符,比如匹配hello出现20次,如果写成hello{20}意味着是hell+o出现20次,o自己重复20次,而不是整个hello重复20次。

我们可以使用分组()来解决这个问题,写成:
/(hello){20}/g;

对于上面的情况,如果我们希望匹配hello或者world出现20次,可以通过使用 | 进行或操作
/(hello|world){20}/g;

举例: good(?=Bayon) 匹配后面有Bayon的good

检测字符串参数中是否存在正则表达式模式,存在返回true不存在返回false

用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回null
除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

举例说明:

search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
search方法不执行全局匹配,它将忽略标志g,同时也忽略正则表达式对象的lastIndex属性,总是返回字符串的第一个匹配的位置

match()方法将检索字符串,以找到一个或者多个与regexp匹配的文本。regexp是否有全局g标志会影响结果。

关于string对象的replace方法,一般可以传入两个字符串,但是只能replace一次,如果把第一个参数传入regexp的话,就可以是replace变得灵活。

经常使用split方法把字符串分割为字符数组
'a,b,c,d'.split(","); // ["a","b","c","d"];
相应的,也可以使用regexp进行切割:
"a1b2c3".split(/\d/); // ["a","b","c","d"]

相似回答