JavaScript正则表达式
通俗的讲,正则表达式用于定义一些字符串的规则,然后计算机可以通过正则表达式的规则来检查一个字符串是否符合规则,或者是从字符串中将符合规则的内容提取出来。例如,一些用于邮箱地址的检验,电话号码的检验等等。(接下来,一起学习,欢迎大家补充知识点)。
创建正则表达式
正则表达式有两种创建方法,一种是构造函数创建方法,它是通过直接使用JS中的RegExp(“正则表达式”,“匹配模式”)构造函数直接new创建。而另一种是字面量创建方法,通过使用双斜杠的方式,将正则表达式放入斜杠中间;例如 /正则表达式/匹配模式.
同时,记住我们可以使用表达式调用它的test()方法检查一个字符串是否符合正则表达式的规则;如果符合则返回true,否则返回false;
var reg = new RegExp("正则表达式","匹配模式"); // 构造函数创建方法
var reg = /正则表达式/匹配模式; //字面量创建方法
接下来我们说一下,匹配模式;常用的匹配模式有两种:i和g
- 字母 ”i“ 表示的是 忽略大小写;
- 字母 ”g“ 表示的是 全局匹配;
先看一段简单的代码:(- i -的示例), 让我们把g放到后面来讲
var reg = /a/; //创建一个正则表达式,检查一个字符串中是否有a字符
console.log(reg.test("abc")); //返回true 因为字符里有a字符
console.log(reg.test("Abc")); //返回false 因为字符串里没有a字符,而是大写A
在这种情况下,如果你想认为A也是a,我们就可以使用匹配模式i忽略大小写
var reg = /a/i; //创建一个正则表达式,检查一个字符串中是否有a字符,注意此时是忽略大小写的匹配模式
console.log(reg.test("Abc")); //返回true 因为字符里有a/A字符
接下来,让我们创建一个正则表达式来检查一个字符串中是否含有a或b;
var reg = /ab/; //试试这种方法是否可行?
console.log(reg.test("abcd")); //返回结果true,这是因为ab连起来检测的是否有ab,显然有,所以返回true
console.log(reg.test("acd")); //返回结果false,而在这里没有ab返回false
console.log(reg.test("bcd"));//返回结果false,而在这里没有ab返回false
因此,检查是否有a或b,我们就不能使用/ab/这样的正则表达;而是要使用符号“|”,它表示了或的意思;而正则表达式应该这样写;
var reg = /a|b/;
console.log(reg.test("acd")); //返回结果true,因为字符串中有a
console.log(reg.test("bcd")); //返回结果true,因为字符串中有b
但是,我们还有其他的方法就是使用[ ]的形式来表示或,它的意思是查找方块内的任意字符:
var reg = /[ab]/;
console.log(reg.test("acd")); //返回结果true,因为字符串中有a
console.log(reg.test("bcd")); //返回结果true,因为字符串中有b
接下来,自己尝试一下,其他的表达式:
表达式 | 描述 |
---|---|
[a-z] | 小写a到z的任意字符 |
[A-Z] | 大写A到Z的任意字符 |
[A-z] | A到Z的任意字符,不区分大小写 |
[^A-z] | 除了字母 |
[0-9] | 0-9任意数字 |
[^0-9] | 除了数字 |
[^ ] | 这个符号在方括号里表示 除了…的意思,记住是在方括号中 |
我们在来尝试一下,检查一个字符串中是否含有abc或adc或aec,让我们想想要怎么表达:
var reg = /abc|adc|aec/;
console.log(reg.test("adc")); //返回true,
然而在这里,我们可以发现,abc,adc,aec都是以a为开头,c为结尾;那么我们就可以使用以下方法:
var reg = /a[bde]c/; //ac是固定的,而中间的字母是或的关系
console.log(reg.test("adc")); //返回true
console.log(reg.test("afc")); //返回false
字符串要配合正则表达式的四个方法
1. split()方法
split()方法,可以将一个字符串拆分为一个数组,方法中可以传递一个参数来指定字符串拆分的规则。而在这里我们可以传递一个正则表达式做为参数,这样该方法将根据正则表达式来拆分字符串。
注意⚠️:这个方法即使不指定全局匹配,也会全部都拆分;
var str = "1a2b3c4d5e6f7";//创建一个字符串
var reg = str.split(/[a-z]/); //根据任意字母拆分字符串
console.log(reg);//返回["1", "2", "3", "4", "5", "6", "7"]
2. search()方法
search()方法,可以搜索字符串中是否含有指定内容,与字符串的indexOf方法很像。如果搜索到指定内容,将返回第一次索引的位置。如果没有搜索到将返回-1。但是不同的是它可以接受一个正则表达式作为参数,然后根据正则表达式去检索字符串。
注意⚠️:search方法只会检查到第一个,不能全局匹配,即使使用了g也不会生效。
var str = "hello hello"; //创建一个字符串
res = str.search("aec"); //检查字符串中是否有aec;
console.log(res)// 返回-1。因为字符串中没有aec
var str = "hello hello"; //创建一个字符串
res = str.search("he"); //检查字符串中是否有he
console.log(res)// 返回0 因为第一个he出现的位置索引为0
3. match()方法
match()方法,可以根据正则表达式,从一个字符串中将符合条件的内容提取出来。
在默认情况下,我们的match方法只会找到一个符合要求的内容;找到后就会停止检索,在这里我们就可以设置正则表达式为全局模式 i,这样就会匹配到多有的内容。
注意⚠️:match会将匹配到的内容封装到一个数组中返回,即使只查到一个结果。
让我们用代码解释一下match方法,和全局匹配:
var str = "1a2b3c4d5e6f7A8"; //创建一个字符串
res = str.match(/a/i); // 检查字符串中是任意的大小写a字母
console.log(res); //只返回了第一个 "a"
从结果看,此时只返回了一个“a”,而后面的大A没有返回;因为当match方法看到a时,就不会在向后检索,只默认找到一个符合要求的内容。如果此时我们希望返回所有的a/A,此时就要是有 g 的全局匹配模式
var str = "1a2b3c4d5e6f7A8";//创建一个字符串
res = str.match(/a/gi); // 检查字符串中是任意的大小写a字母,注意此处加上了g
console.log(res); //而此时返回了。 ["a", "A"]
4. replace()方法
replace方法可以将字符串中指定内容替换为新的内容;
参数:replace(“被替换的内容”,“新的内容”),此处被替换的内容可以接受一个这则表达式作为参数。默认只会替换一个。使用全局匹配可以替换全部;
var str = "1a2b3c4d5e6f7A8"; //创建一个字符串
res = str.replace(/[a-z]/gi,""); //将字母都换成空字符
console.log(res);//返回 12345678
量词
通过量词可以设置一个内容出现的次数。
注意⚠️:量词只对它前边的一个内容起作用。
量词 | 含义 |
---|---|
{n} | 正好出现n次 |
{m,n} | 出现m到n次 |
{m,} | 出现m次以上 |
n+ | 表示至少出现一次,相当于{1, } |
n* | 表示出现0个或多个,相当于{0,},有没有都行 |
n? | 表示出现0个或1个,相当于{0,1} |
n$ | 以n为结尾 |
^ n | 以n为开头 |
转义字符
在正则表达式中同样要用转义字符来表示特殊符号,但是要注意的是,在使用构造函数时,由于他的参数是一个字符串,而\是字符串中转义字符,所以要使用两个双斜杠\.
var reg = /\./; //字面量创建方法中使用单斜杆
var reg = new RegExp("\\.");// 构造函数使用双斜杆
元字符
元字符表示拥有特殊含义的字符。
元字符 | 描述 |
---|---|
\w | 表示任意字母,数字,下划线; 相当于[A-z0-9_] |
\W | 表示除了字母,数字,下划线; 相当于[^A-z0-9_] |
\d | 表示任意数字;相当于[0-9] |
\D | 表示除了数字;相当于[^0-9] |
\s | 表示空格 |
\S | 表示除了空格 |
\b | 表示单词边界 |
\B | 除了单词边界 |
例子:去除掉空格,其实去除掉字符串中的宫格就是使用“”替换掉空格符.因此在这里我们可以使用replace方法;
var str = " admin ";
str = str.replace(/\s/g,"");//这里我们要设置全局匹配,否则之后替换掉第一个空格
console.log(str); // 返回 “admin”
注意,在这里如果空格是以这种形式出现 str = " ad min " , 我们应该考虑这是用户故意输入的,而不是前后无意间输入的。所以我们应该保留admin之间的空格。我们可以这么做:
var str = " ad min ";
str = str.replace(/^\s*|\s*$/,""); //这里我们去掉了以空格为开头的0个或多个空格,也替换了以空格为结尾的0个或多个空格;
console.log(str); //返回“ad min”
此处,我所学到的就只有这些,希望大家多给予指点,继续学习。