资讯专栏INFORMATION COLUMN

js正则表达式的模式匹配

Kerr1Gan / 1991人阅读

摘要:一正则表达式的定义正则表达式是一个描述字符模式的对象对象更多的是通过一种特殊的直接量语法来创建正则表达式的模式规则是由一个字符序列组成的包括所有字母和数字在内大多数的字符都是按照直接量仅描述待匹配字符的二直接量字符正则表达式中的所有字母和数

一.正则表达式的定义

1.正则表达式(regular expression)是一个描述字符模式的对象.
2.RegExp对象更多的是通过一种特殊的直接量语法来创建.

var reg = /d/;

3.正则表达式的模式规则是由一个字符序列组成的,包括所有字母和数字在内,大多数的字符都是按照
直接量仅描述待匹配字符的.

二.直接量字符

1.正则表达式中的所有字母和数字都是按照字面含义进行匹配的,
也支持非字母的字符匹配,需要通过反斜杠()作为前缀进行转义.比如/n/用以匹配换行符.

var str = "abc12345";
// 直接量字符
var reg = /b/;
console.log(str.match(reg));    // ["b", 1]
三.字符类

1.将直接量字符多带带放进方括号内就组成了字符类.
一个字符类可以匹配它所包含的任意字符,/[abc]/就和字母"a","b","c"中的任意一个都匹配.
2.另外,可以通过^符号来定义否定字符类,它匹配所有不包含在方括号内的字符.
3.字符类可以使用连字符来表示字符范围,/[a-z]/,[a-zA-Z0-9].
4.由于某些字符类非常常用,因此在js的正则表达式语法中,使用了这些特殊字符的转义字符来表示他们.
5.在方括号内也可以写这些特殊转义字符,/[sd]/就匹配任意空白符或者数字

// 字符类
var reg = /[bc]/;
console.log(str.match(reg));    // ["b", 1]
var reg = /[^bc][^bc]/;
console.log(str.match(reg));
var reg = /d/g;
console.log(reg.test(str)); // true
console.log(str.match(reg)); // [1,2,3,4,5]

[...] 方括号内的任意字符
1 不在方括号内的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
w [a-zA-Z0-9]
W 2
s 任何Unicode空白符
S 任何非Unicode空白符的字符
d [0-9]
D 3

var reg = /s/g;
console.log(str.replace(reg, ""));
四.重复

1.这些正则表达式语法中较为复杂的模式都提到了正则表达式中某元素的"重复出现次数".
2.我们在正则模式之后跟随用以指定字符重复的标记.
3.在使用"*"和"?"时要注意,由于这些字符可能匹配0个字符,因此他们允许什么都不匹配.
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或多次,也即是说前一项是可选的,等价于{0,1}

匹配前一项1次或多次,等价于{1,}

匹配前一项0次或多次,等价于{0,}

// 重复
var reg = /d{2}/;
console.log(str.match(reg));    // ["12"]

var reg = /d{2,}/;
console.log(str.match(reg));    // ["12345"]

var reg = /d{2,4}/;
console.log(str.match(reg));    // ["1234"]

//邮箱 1006894640@qq.com
var str = "1006894640@qq.com.cn";
var reg = /w+@w+(.w+)+/;
console.log(str.match(reg));
四.非贪婪的重复

1.上面列出的匹配重复时尽可能多的匹配,而且允许后续的正则表达式继续匹配,因此,我们称之为"贪婪的匹配".
2.我们同样可以使用正则表达式进行非贪婪匹配,只需在待匹配的字符后跟随一个问号即可."??","+?","*?"或"{1,5}+".
3.比如,/a+/可以匹配一个或多个连续的字母a,当使用"aaa"作为匹配字符串时,正则表达式会匹配它的三个字符.
但是/a+?也可以匹配一个或多个连续字母a,但是它尽可能少的匹配.

// 非贪婪的匹配
var str = "aaab";
var reg1 = /a+/;
var reg2 = /a+?/;
console.log(str.match(reg1));   // ["aaa"]
console.log(str.match(reg2));   // ["a"]
五.选择,分组和引用

1.正则表达式的语法还包括指定选择项,子表达式分组和引用前一子表达式的特殊字符.
字符"|"用于分隔供选择的字符,例如/ab|cd|ef/可以匹配字符串"ab",也可以匹配字符串"cd","ef".
2.正则表达式中的圆括号有多种作用,一个作用是把多带带的项组合成子表达式,以便可以像处理一个独立的
单元那样用"|","*","+","?"等来对单元内的项进行处理.

// 分组,引用
var str = "javascript";
var reg1 = /java(script)?/;
console.log(str.match(reg1));   // ["javascript", "script"]

var str = "abc123";``
var reg = /w+(d+)/;
console.log(str.match(reg));    // ["abc123", "3"]
六.指定匹配位置

1.正则表达式中的多个元素才能匹配字符串的一个字符,例如s匹配的只是一个空白符,
还有一些正则表达式的元素匹配的是字符之间的位置,而不是实际的字符,例如b匹配一个单词的边界,即位于w和W之间的边界.
2.像b这样的元素不匹配某个可见的字符,它们指定匹配发生的合法位置.
有时我们称这些元素为正则表达式的锚,因为他们将模式定位在搜索字符串的特定位置上.
最常用的锚元素是^,它用来匹配字符串的开始,锚元素$用以匹配字符串的结束.
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
b 匹配一个单词的边界,简言之,就是位于字符w和W之间的位置,或位于字符s和字符串的开头或结尾之间的位置
B 匹配非单词边界的位置

// 匹配非单词边界
var str1 = "javascript";
var str2 = "scripting";
var reg1 = /script/;
var reg2 = /Bscript/;
console.log(str1.match(reg1));  // null
console.log(str1.match(reg2));  // ["script"]
console.log(str2.match(reg1));  // ["script"]
console.log(str2.match(reg2));  // null
七.修饰符

1.正则表达式的修饰符,用以说明高级匹配模式的规则.
"i"用以说明模式匹配是不区分大小写的
"g"说明模式匹配应该是全局的,也就是说,应该找出被检索字符串中所有的匹配

// 修饰符
var str = "AAaa";
var reg = /a/;
console.log(str.match(reg));    // ["a"]
var reg = /a/g;
console.log(str.match(reg));    // ["a","a"]
var reg = /a/i;
console.log(str.match(reg));    // ["A"]
var reg = /a/gi;
console.log(str.match(reg));    // ["A", "A", "a", "a"]
用于模式匹配的String方法

String对象的一些用以执行正则表达式模式匹配和检索替换操作的方法

String.search

1.search(),他的参数是一个正则表达式,返回一个与之匹配的字串的起始位置,如果找不到匹配的字串,它将返回-1.

var str = "javascript123";
var reg = /script/i;
console.log(str.search(reg));   // 4
String.replace

1.replace()方法用以执行检索与替换操作,其中一个参数是一个正则表达式,第二个参数是要进行替换的字符串.
如果正则表达式中设置了修饰符g,那么源字符串中所有模式匹配的字串都将替换成第二个参数指定的字符串,
如果不带修饰符g,则只替换所匹配的第一个字串.
2.正则表达式中使用圆括号括起来的子表达式是带有从左到右的索引编号的,而且正则表达式会记忆与每个子表达式匹配的文本.
如果在替换字符串中出现了$加数字,那么replace()将用与指定的子表达式相匹配的文本来替换这两个字符.
3.replace()方法还有一些其他重要特性,第二个参数可以是函数,该函数能够动态的计算替换字符串.

var reg = /j(ava)sc(ri)pt/g;
console.log(str.replace(reg, "$1"));    // "ava"
console.log(str.replace(reg, "$2"));    // "ri"
console.log(str);   // "javscript",原字符串保持不变,字符串永远不会变化,除非另外赋值.

var str2 = str.replace(reg, (a, b, c, d, e) => {
    console.log(a); // "javascript" 匹配字符串
    console.log(b); // "ava"    $1
    console.log(c); // "ri"     $2
    console.log(d); // 0    匹配位置
    console.log(e);
    return 1;  // 匹配结果
});
console.log(str2);  // 1
String.match

1.match()方法是最常用的String正则表达式方法.它的唯一参数就是一个正则表达式,返回的是一个由匹配结果组成的数组.
如果该正则表达式设置了修饰符g,则该方法返回的数组包含字符串中的所有匹配结果.

// match
var str = "javascriptjava";
var reg = /java/;
console.log(str.match(reg));   // ["java", 0]

var text = "Visit my blog at http://www.example.com/~david";
var url = /(w+)://([w.]+)/(S*)/;
var result = text.match(url);
console.log(result);
console.log(result.length); // 4
for (var i = 0; i < result.length; i++) {
    console.log(result[i]); // "http://www.example.com/~david",http,"www.example.com","~david"
}
String.split

split()用以将调用它的字符串拆分为一个子串组成的数组,使用的分隔符是split()参数.
split()方法的参数可以是一个正则表达式,这使得split()方法异常强大.

// split
var str = "abcde";
console.log(str.split("c")); // ["ab", "de"]

// 可以指定分隔符,允许两边可以留有任意多的空白字符
var str = "1,  2,3, 4,    5";
console.log(str.split(/s*,s*/));  // [1, 2, 3, 4, 5]
RegEXP对象

RegExp对象定义了两个用于执行模式匹配操作的方法.
exec()方法与match()类似,只是RegExp方法的参数是一个字符串,而String方法的参数是一个RegExp对象.
另外一个RegExp方法是test(),它的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true.

... ↩

a-zA-Z0-9 ↩

0-9 ↩

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84407.html

相关文章

  • 正则JS正则

    摘要:注意本文将正则与中的正则分开讨论。正则零宽断言更多参考各种语言对于正则不同支持参考单行模式与多行模式通过设置正则表达式后的修饰符可开启对应的匹配模式单行模式和多行模式。 最近这段时间帮同学处理一些文档, 涉及到一些结构化文档的工作大部分都得使用正则表达式, 之前对于正则的认识大多来源于语言书上那几页的介绍, 自己也没有用过几次。这里将我之前感到模糊的概念作个整理。因为对JS了解多点,所...

    firim 评论0 收藏0
  • JavaScript正则达式总结

    摘要:正则表达式一直是里比较难以掌握的点。在中创建正则的两种方式使用字面量这就是正则表达式的字面量语法,表示正则表达式的模式,为正则表达式的标志。字面量形式的正则表达式一般使用较多,也推荐大家尽可能使用这种形式,简洁易读,符合正常的使用习惯。 正则表达式一直是js里比较难以掌握的点。 看不懂,学不会,记不住。 每次需要用到正则的时候,都需要再去查找资料。 今天花时间把正则的知识点总结下,希望...

    big_cat 评论0 收藏0
  • JS基础入门篇(三十三)—正则达式

    摘要:举例一使用这个正则,打印结果为使用这个正则,打印结果为举例二打印结果如下过滤标签你好美丽的上海想转化成你好,美丽的上海如果后面加,就会进入非贪婪模式。如果后面不加,就会进入贪婪模式,结果为上海。你好美丽的上海。 1.创建一个正则表达式 方法一:使用一个正则表达式字面量,其由包含在斜杠之间的模式组成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:调用Re...

    caspar 评论0 收藏0
  • JS基础入门篇(三十三)—正则达式

    摘要:举例一使用这个正则,打印结果为使用这个正则,打印结果为举例二打印结果如下过滤标签你好美丽的上海想转化成你好,美丽的上海如果后面加,就会进入非贪婪模式。如果后面不加,就会进入贪婪模式,结果为上海。你好美丽的上海。 1.创建一个正则表达式 方法一:使用一个正则表达式字面量,其由包含在斜杠之间的模式组成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:调用Re...

    hot_pot_Leo 评论0 收藏0
  • JS基础入门篇(三十三)—正则达式

    摘要:举例一使用这个正则,打印结果为使用这个正则,打印结果为举例二打印结果如下过滤标签你好美丽的上海想转化成你好,美丽的上海如果后面加,就会进入非贪婪模式。如果后面不加,就会进入贪婪模式,结果为上海。你好美丽的上海。 1.创建一个正则表达式 方法一:使用一个正则表达式字面量,其由包含在斜杠之间的模式组成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:调用Re...

    y1chuan 评论0 收藏0
  • JS正则达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路

    摘要:控制权和传动这两个词可能在搜一些博文或者资料的时候会遇到,这里做一个解释先控制权是指哪一个正则子表达式可能为一个普通字符元字符或元字符序列组成在匹配字符串,那么控制权就在哪。 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路;正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,...

    Michael_Lin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<