二十八、正则术语

二十八、正则术语

正则表达式是由普通字符和特殊字符组成

普通字符:字母数字

特殊字符:具有特殊含义的字符() [] {} + ? * .

如果相匹配特殊字符,需要添加转义:\

28.1 精确匹配

只匹配普通字符就是精确匹配

1
2
3
4
5
// 精确匹配只含有普通字符
var str = "abchhhhabcjjbca";
// 将字符串所有abc进行输出
// /abc/含义:匹配字符必须含有 a, b, c 三个字符;同时 abc组合顺序不能改变
console.log(str.match(/abc/g));

UPRqI0.png

28.2 特殊预定义字符

1
2
\t  :制表符
\n :回车符

28.3 字符集

1
[] :表示字符集,用于字符可能性匹配

28.3.1 简单字符集 [abc]

简单字符集:将所有的可能性直接书写在中括号内部,一次中括号只能匹配一个结果

1
2
3
4
var str = "abcncjahckajayck";
// 将 abc, ahc, ayc 字符串匹配到
// [bhy] 表示能够匹配 b,能够匹配 h,能够匹配 y
console.log(str.match(/a[bhy]c/g));

UPWAJK.png

28.3.2 范围类 [0-9]

范围类:将同种数据书写在一起,用-连接。比如[0-9] [a-z]

1
2
3
// 范围类:使用 - 连接
var str2 = "abcncajcjahckajayck"
console.log(str2.match(/a[a-z]c/g));

Uifyiq.png

28.3.3 组合类 [0-9a-z]

组合类:不同范围匹配。比如[0-9a-z]

1
2
3
// 组合类
var str2 = "abcnca9cjahckaja7ck"
console.log(str2.match(/a[0-9a-z]c/g));

UifveH.png

28.3.4 负向类 [^0-9]

负向类:表示不含有这些可能性 用 [^] 表示,紧挨着左中括号书写在后面

1
2
3
// 负向类
var str2 = "abcnca9cjahckaja7ckaHc"
console.log(str2.match(/a[^0-9]c/g));

Uihnkn.png

28.4 修饰符

正则表达式可以在//后面书写修饰符

28.4.1 //g 全局匹配

g:表示全局匹配,当匹配到第一个满足条件的字符串不会停止,继续匹配所有满足条件的字符串。

1
2
3
4
var str = "abcncjahckajayck";
// 将 abc, ahc, ayc 字符串匹配到
// [bhy] 表示能够匹配 b,能够匹配 h,能够匹配 y
console.log(str.match(/a[bhy]c/g));

UihQpV.png

28.4.2 //i 对大小写不敏感

i :js严格区分大小写,如果书写i表示对大小写不敏感

修饰符可以书写多个

1
2
3
4
5
6
// i 表示对大小写不敏感
var str2 = "aBcncjahckajaYck";
// [a-z]表示所有的小写字母
console.log(str2.match(/a[a-z]c/g)); // ["ahc"]
// i 表示对大小写不敏感
console.log(str2.match(/a[a-z]c/gi)); // ["aBc", "ahc", "aYc"]

UihDXD.png

28.5 量词

用于处理紧密相连的多个同类的字符

28.5.1 {n}:硬性量词

{n}:硬性量词。表示该字符连续出现n次。

1
2
3
4
var str = "abbbcabbbbbc";
console.log(str.match(/abbbc/g));
// b{3} 表示 b 连续出现3次
console.log(str.match(/ab{3}c/g));

UihqNn.png

28.5.2 {n,m} :软性量词

{n,m} :软性量词。表示字符连续出现至少n次,最多不能超过m

28.5.3 {n,} :至少出现n次,最多没有限制

{n,} :至少出现n次,最多没有限制

1
2
3
4
5
6
7
8
9
var str = "abbbcabbbbbcabbbbbbbbbbbbbbbc";
console.log(str.match(/abbbc/g));
// b{3} 表示 b 连续出现3次
console.log(str.match(/ab{3}c/g));

// {n,m}出现次数 n~m次
console.log(str.match(/ab{3,9}c/g));
//{n,}至少出现 n 次,最多没有限制
console.log(str.match(/ab{3,}c/g));

Ui4Xad.png

28.5.4 + :表示至少出现1

+ :表示至少出现1次。等价于 {1,}

1
2
3
var str = "acabcabbbcabbbbbcabbbbbbbbbbbbbbbc";
// + 表示只是少出现一次 等价于 {1,}
console.log(str.match(/ab+c/g));

Ui5Zin.png

28.5.5 ? :表示出现 0 或 1 次

? :表示出现 0 或 1 次 等价于 {0,1}

1
2
3
var str = "acabcabbbcabbbbbcabbbbbbbbbbbbbbbc";
// ? 表示出现 0 或 1 次 等价于 {0,1}
console.log(str.match(/ab?c/g));

28.5.6 *:表示出现任意次

*:表示出现任意次 等价于{0,}

1
2
3
var str = "acabcabbbcabbbbbcabbbbbbbbbbbbbbbc";
// * 表示出现任意次 等价于 {0,}
console.log(str.match(/ab*c/g));

28.6 边界

28.6.1 ^ 开头匹配

^ :书写在正则表达式最左侧,表示开头匹配。表示能够匹配^后面所有字符作为开头。

1
2
3
4
var str = "abciabc";
console.log(str.match(/abc/g));
// ^ 开头匹配
console.log(str.match(/^abc/g));

Ui5fOS.png

28.6.2 $ 结尾匹配

$:结尾匹配,书写在正则表达式最右侧。表示以$前面所有的字符作为结尾匹配。

1
2
3
4
var str = "abbcdciabcd";
console.log(str.match(/bcd/g));
// $ 结尾匹配
console.log(str.match(/bcd$/g));

UiIFl6.png

28.6.3 ^$案例

① 不加边界 字数超了仍显示正确

1
2
3
4
5
6
7
8
// 验证号码正确性 000-1234567 没有其他字符
var str = prompt("请输入本地号码");
// 验证号码正确性
if(/[0-9]{3}-[0-9]{7}/.test(str)){
alert("正确");
}else{
prompt("您输入的号码有误,请重新输入")
}

UiInkd.png

② 添加边界

1
2
3
4
5
6
7
8
9
10
// 验证号码正确性 000-1234567 没有其他字符
var str = prompt("请输入本地号码");
// 验证号码正确性
// test()检测字符串中是否含有正则匹配
// test()在检测时必须添加^$字符才可以正确匹配
if(/^[0-9]{3}-[0-9]{7}$/.test(str)){
alert("正确");
}else{
prompt("您输入的号码有误,请重新输入")
}

UioiNj.png

28.6.4 \b 单词边界

\b :表示单词边界。匹配位于单词开头或者结尾字符

1
2
3
4
5
var str = "hello world";
// \b 单词边界 位于单词的开头,连续多个字符。空格不算字符,斩断。然后继续开始
console.log(str.match(/\b[a-z]+/g));
console.log(str.match(/[a-z]+\b/g));
console.log(str.match(/\b[a-z]+\b/g));

UioGgx.png

28.6.5 \B 非单词边界

\B 非单词边界,不位于单词的开头或者结尾匹配

1
2
3
4
// \B 非单词边界,不位于单词的开头或者结尾匹配
console.log(str.match(/\B[a-z]+\B/g));
console.log(str.match(/\B[a-z]+/g));
console.log(str.match(/[a-z]+\B/g));

UioDPA.png

28.7 预定义类

字符集特殊写法

  • . :除了回车和换行之外的所有字符

  • \w :所有的单词字符字母,数字,下划线_

  • \W :非单词字符

  • \d :数字

  • \D :非数字

  • \s :所有空白字符,比如空格、缩进

  • \S :非空白字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//  .  :除了回车和换行之外的所有字符  .+ 表示连续除了回车和换行之外的所有字符
console.log("jfjjfj &56JJJ".match(/.+/g)); // ["jfjjfj &56JJJ"]
// \w :所有的单词字符字母,数字,下划线_
console.log("jf---7888 &56J_JJ".match(/\w+/g)); // ["jf", "7888", "56J_JJ"]
// \W :非单词字符
console.log("jf---7888 &56J_JJ".match(/\W+/g)); // ["---", " &"]
// \d :数字
console.log("jf---7888 &56J_JJ".match(/\d+/g)); // ["7888", "56"]
// \D :非数字
console.log("jf---7888 &56J_JJ".match(/\D+/g)); // ["jf---", " &", "J_JJ"]
// \s :所有空白字符,比如空格、缩进
console.log("jf---7888 &56J_JJ".match(/\s+/g)); // [" "]
// \S :非空白字符
console.log("jf---7888 &56J_JJ".match(/\S+/g)); // ["jf---7888", "&56J_JJ"]

UkVEOP.png

28.8 或操作符

| :表示或操作符

1
2
// a| b 表示或者是 a 或者是 b
console.log("bccccac".match(/(a|b)c/g)); // ["bc", "ac"]

UkV0p9.png

28.9 分组匹配

() :用于匹配连续多个字符,小括号表示整体

1
2
// 匹配 abcabc (abc){2}表示abc这个整体连续出现 2
console.log("abcabc12abc34abcabcabc56".match(/(abc){2}/g)); //  ["abcabc", "abcabc"]

28.10 分组反向引用

28.10.1 \编码 正则内再次使用

\编码(每一个小括号对应一个编码,不表示次数,从1、2、3、……):

分组匹配到的字符串,可以在正则内部再次使用

1
2
3
4
5
6
7
8
9
10
11
// \编码(每一个小括号对应一个编码,不表示次数,从1、2、3、……):
// 分组匹配到的字符串,可以在正则内部再次使用
// (abc)\1 表示匹配到abc并再次匹配bac,相当于abcabc
console.log("abcabc12abc34abcabcabc56".match(/(abc)\1/g)); // ["abcabc", "abcabc"]

console.log("xyzxyzabc12".match(/([a-z]{3})\1/g)); // ["xyzxyz"]

// 编码:只表示编码,没有次数的含义
// ([a-z]{3})(\d{2})\2\1 表示([a-z]{3})编码为 1 (\d{2})编码为 2
// a~z 3个字母 2个数字 再次匹配2个数字 再次匹配3个字母
console.log("xyzabc1212abc".match(/([a-z]{3})(\d{2})\2\1/g)); // ["abc1212abc"]

28.10.2 $编码 正则外再次使用

还可以在正则表达式外部使用。$编码

1
2
3
4
5
// "123*456" 改为"456*123"
var str = "123*456";
// 再次使用一定书写小括号,$编码 单独书写*有特殊含义,\*表示转义。
var str1 = str.replace(/(\d{3})\*(\d{3})/,"$2*$1");
console.log(str1); // 456*123

replace()第二个参数还可以书写为匿名函数,match函数,可以让操作更加灵活。

1
2
3
4
5
6
7
8
// "123*456" 改为"456*123"
var str = "123*456";
// replace()第二个参数可以是匿名函数,第一个形参必须是match,其他参数是$编码。
//编码和小括号一一对应,不能少写,必须写全,但是可以不使用
var str2 = str.replace(/(\d{3})\*(\d{3})/,function(match,$1,$2){
return $2 + "*" +$1;
});
console.log(str2); // 456*123

28.11 中文匹配

匹配中文: [\u4e00-\u9fa5]

是一个固定用法,中文只能在正则表达式里这样表示。

1
2
3
4
// 匹配中文: [\u4e00-\u9fa5]
// 是一个固定用法,中文只能在正则表达式里这样表示。只能匹配中文
// [\u4e00-\u9fa5]+ 表示连续多个汉字
console.log("中文abc匹配".match(/[\u4e00-\u9fa5]+/g));

UkZE9J.png

点击查看

本文标题:二十八、正则术语

文章作者:Mango

发布时间:2020年07月08日 - 22:02:48

最后更新:2020年07月08日 - 22:35:39

原始链接:https://mango185.github.io/post/ff7c4078.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------