正则表达式-语法篇

210 阅读1分钟

附:「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

正则表达式结构

正则表达式结构分为2大类:字符直接量元字符

字符直接量: 字母和数字 == 自身(也就是说数字就是数字,字母就是字母),\n 换行符 ,\t 制表符,\r 回车符 , \f 换页符

元字符:正则表达式中有许多标点符号有着特殊的含义。

  • 例如:^代表字符串的开头,$代表字符串的结尾,点号.表示出换行符之外的任意字符,等等。这些字符称为元字符 。
  • 如果需要以直接量的形式使用元字符,则需使用\来转义。 例如,如果表示直接量字符^ ,在使用正则表达式字面量时就需要转义,写出^ ;在使用RegExp构造函数时,需使用\转义,写成\^

正则表达式

正则表达式的语法主要涉及: 字符类量词候选子表达式锚字符

1.字符类

(1)将直接量字符放进方括号[]内,就可以组合成字符类。

var str = "abeda";
var reg = /[abc]da/; 
if(reg.test(str)){
   console.log("true");
 }else {
   console.log("false");
 }

代码分析: /[abc]da/ 表示只要是字符串"ada","bda","cda"这三种可能都匹配,返回true。其他字母,返回false。所以这里 "abeda"是返回false

(2) 还可以定义字符类的否定,使用 ^ 字符。

var str = "abeda";
var reg = /[^abc]da/; 
if(reg.test(str)){
   console.log("true");
 }else {
   console.log("false");
 }

代码分析:/[^abc]da/ 表示只要是非字符串"ada",“bda”,"cda"这三种可能都匹配,返回true。其他字母,返回false。所以这里 "abeda"是返回true,因为它不匹配这三种可能

(3) 如果要表示某个范围类的字符,还可以使用连字符-

情况1:[0-9]匹配0到9之间的任意一个数字,如果加^,就表示不是数字字符都可以。

var str = "abeda";
// var reg = /[0-9]da/; // 只要是0-9都可以,返回true
var reg = /[^0-9]da/; // 加上^后,表示只要不是数字都可以
if (reg.test(str)) {
  console.log("true");
} else {
  console.log("false");
}

情况2:[a-zA-Z]匹配a到z之间的任意大小写字母,如果加^,就表示不是字母字符都可以。

var str = "abeda";
// var reg = /[a-zA-Z]da/; // 这样也可以,意思是包含所有a-z区间,无论大小写字母
var reg = /[^a-zA-Z]da/; // 加上^后,表示只要不是字母都可以
if (reg.test(str)) {
  console.log("true");
} else {
  console.log("false");
}

(4) 某些字符类用的非常多,所以Javascript中包含了一些特殊字符和转义序列来表示这些常用的字符类。

  • 例如,\s表示任意的空白字符,\S表示任意的非空白字符
  • 使用场景:比如说一篇文章内容都是用空格字符隔开的,此时我们可以使用\s来区分空白字符,然后把空格字符换成逗号,以逗号形式隔开。
var str = "abe da";
var reg = /\sda/;
if (reg.test(str)) {
  console.log("true");
} else {
  console.log("false");
}

(5) 字符类例子

var str1 = "11d22";
var reg1 = /\d\d[abc-e]\w/; // 一一对应str1中数值进行匹配
document.write(reg1.test(str1)); //输出true

代码分析:

  • \d 匹配一个数字字符。等价于 [0-9]
  • [abc-e] 表示区间,这里是等价于abcde
  • \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]',也就是任意大小写字母和数字

2.量词

字符类都只匹配单个字符。如果要匹配5个数字,可以使用正则表达式/\d\d\d\d\d/, 这样做是比较麻烦的。量词就可以解决类似问题。

  • 量词可以指定某个特定模式出现的次数。当指定某个模式应当出现的次数时,可以硬性指定其出现的次数。例如,指定某个字符出现4次,也可以指定软性数量。 例如,这个字符至少出现一次。

情况 1: 没有使用量词的正则表达式,这里是多次输入\d\d表示的意思是:匹配一个数字字符。等价于 [0-9]

var str1 = "11d22";
var reg1 = /\d\d[abc-e]\w/;
document.write(reg1.test(str1)); //输出true

情况 2 : 使用量词的表达式,这里是将上面出现多次\d代码,写成\d{2},表示\d这样的字符可以出现2次。

var str1 = "11d22";
var reg1 = /\d{2}[abc-e]\w/; // \d{2} 表示任意单个数字字符,可以出现2次
document.write(reg1.test(str1)); //输出true

情况 3 : 多种字符情况下,量词的使用

var str1 = "a11d22AAAA";
var reg1 = /\d{2}[a-z]\d{2}A+/;
document.write(reg1.test(str1)); //输出true

代码分析: /\d{2}[a-z]\d{2}A+/

  • \d{2} 表示:任意数字字符可以出现2次
  • [a-z] 表示:a-z区间任意字母字符
  • \d{2} 表示:任意数字字符可以出现2次 -A+ 表示:至少出现1次或者多次

情况 4: 量词案例,小细节注意!

var str1 = "122321341424a11d22AAAA";
var reg1 = /\d{2}[a-z]\d{2}A+/;
document.write(reg1.test(str1)); //输出true

这个情况下也是返回true,无论你写多少,只要其他的一段字符满足正则表达式都是可以的,而不是看开头是什么。但是如果这个正则表达式加上了 ^$,这个例子就一定是返回false的。

补充:

  • ^ 表示匹配输入字符串的开始位置
  • $ 则匹配输入字符串的结束位置

3. 候选

有时要构建一个匹配所有可能性的模式是很困难的。例如,要用正则表达式匹配 "hello" ”javascript” 要如何做呢?

正则表达式提供了候选操作符 “|” 来解决这种问题。“|” 类似于“或者”的意思。

var str1 = "hello";
var str2 = "javascript";
var reg1 = /hello|javascript/;
document.write(reg1.test(str1)); //输出true
document.write(reg1.test(str2)); //输出true

情况 1: 候选的使用场景,多项选择

  • 老身份证号码(16位)和二代身份号码(18位)
  • 手机号(11位数字)和座机号(一般7-8位数)
  • 2000年(00后) 和 1990年 (90后)

(1)身份证验证

var str1 = "431103199920217890";
var str2 = "4311031999202178";
var reg = /18位|16位/; // 可以是18位也可以是16位

(2)手机号和座机号验证

var str1 = "17675849086";
var str2 = "021-69776543";
var reg = /手机号|座机号/; 

(3)00后和90后验证

var str1 = "2000-02-01";
var str2 = "1993-04-06";
var reg = /00后|90后/; 

4.子表达式

子表达式用于处理字符序列

  • 例如:需要匹配 hellohello ,可以构造如下正则表达式: /hellohello/,使用子表达式,则可以写成:/(hello){2}/
<script>
  var reg = /([bd]ad?)*/;
  var str1 = "";
  var str2 = "ba";
  var str3 = "da";
  var str4 = "bad";
  var str5 = "dad";
  var str6 = "badba";
  var str7 = "dadbadda";
  document.write(reg.test(str1)); 
  document.write(reg.test(str2)); 
  document.write(reg.test(str3));
  document.write(reg.test(str4));
  document.write(reg.test(str5));
  document.write(reg.test(str6));
  document.write(reg.test(str7)); 
</script> 

代码分析:/([bd]ad?)*/

  • [bd]ad 表示字符串“bd”,“bdce”,都可以匹配。
  • 匹配前面的子表达式零次或一次,例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
  • * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

5.锚字符

对于正则表达式/he/,字符串”he”,”hello”,”hefda”都可以与之匹配。但有时我们只需要找出一篇文章中所有的单词”he”,而”hello”等则不需要找出。这时要将正则表达式修改为/\bhe\b/ 。这里的\b是正则表达式中锚字符 。

  • \b 匹配词语的边界。即位于\w和\W之间的位置
  • \B 匹配非词语边界的字符
  • ^ 匹配字符串的开头
  • $ 匹配字符串的结尾

6.常用正则表达式

(1)

  • 验证用户名和密码:/^[a-zA-Z]\w{5,15}$/ 。正确格式:由字母、数字、下划线组成,并且第一个字必须为字母,6~16位;
  • 验证电话号码:/^(\d{3,4}-)\d{7,8}$/ 。正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
  • 验证身份证号:/^\d{17}[\d|X]|\d{15}$/
  • 验证Email地址:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  • 只能输入由数字和26个英文字母组成的字符串:/^[A-Za-z0-9]+$/
  • 整数或者小数:/^[0-9]+\.{0,1}[0-9]{0,2}$/
  • 只能输入数字:/^[0-9]*$/
  • 只能输入n位的数字:/^\d{n}$/

(2)

  • 只能输入至少n位的数字:/^\d{n,}$/
  • 只能输入m~n位的数字:/^\d{m,n}$/
  • 只能输入零和非零开头的数字:/^(0|[1-9][0-9]*)$/
  • 只能输入有两位小数的正实数:/^[0-9]+(.[0-9]{2})?$/
  • 只能输入有1~3位小数的正实数:/^[0-9]+(.[0-9]{1,3})?$/
  • 只能输入非零的正整数:/^\+?[1-9][0-9]*$/
  • 只能输入非零的负整数:/^\-[1-9][]0-9/*$
  • 只能输入长度为3的字符:/^.{3}$/
  • 只能输入由26个英文字母组成的字符串:/^[A-Za-z]+$/

(3)

  • 只能输入由26个大写英文字母组成的字符串:/^[A-Z]+$/
  • 只能输入由26个小写英文字母组成的字符串:/^[a-z]+$/
  • 只能输入汉字:/^[\u4e00-\u9fa5]{0,}$/
  • 验证URL:/^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/
  • 验证一年的12个月:/^(0?[1-9]|1[0-2])$/ 。正确格式为:01~09和10~12
  • 验证一个月的31天:/^((0?[1-9])|((1|2)[0-9])|30|31)$/。正确格式为01~09/和10~31。24.匹配首尾空白字符的正则表达式:/^\s*|\s*$