首页 > 代码库 > 正则表达式

正则表达式

  正则表达式,又叫规则表达式,我们写一个正则表达式,其实就是写一个规则,那么写一个规则干什么呢? 去匹配字符串,就是看看字符串中有哪个部分和我们定义的规则相符合,找到这些匹配的字符,我们就可以进行字符替换删除等操作,如下例子: 找到字符串中的所有数字,转化成字符G.  可以看到,正则表达式极大地方便了对字符串的操作。

let reg = /\d/g; // 定义一种规则,\d 表示数字。
let str = ‘a4c5d6‘
let strReplaced = str.replace(reg,"G")
console.log(strReplaced)    //  aGcGdG

  JS 是通过内置RegExp对象来支持正则表达式。既然是对象,那就有两种创建方式, 一种是对象字面量,一种是构造函数。

// 对象字面量
let regLiteral = /\d/g;
// 构造函数
let regCons = new RegExp(‘\\d‘, "g");

  构造函数使用不是太方便,一般都是使用字面量,只有在事先不确定的情况下需要动态生成时,才需要用到构造函数。

  2, 标识符: 上面的g 就是一个标识符,除了它,还有两个i, m

    g 是global,表示全局匹配。为什么会有这个标识符呢? 因为正则表达式匹配字符串时,默认是惰性匹配,就是,它只要成功匹配到一个,它就不会再进行匹配,把let reg = /\d/g 中的g 去掉,

let reg = /\d/; 
let str = ‘a4c5d6‘
let strReplaced = str.replace(reg,"G")
console.log(strReplaced)    //  aGc5d6

  可以看到,它只会匹配第一个数字4。从字符串的起始位置开始匹配,只要成功匹配到一个,就停止了, 即使字符串后面还有和正则表达式相匹配的,它也不管。加上g 标识符,就告诉正则表达式全部匹配,字符串中只要有和正则表达式相匹配的,就全部进行匹配,对应到替换字符,就是全部替换掉相符合的。

  i,是ignore, 忽略大小写。这很好理解, js就是区分大小写的,如果用一个大写字母去区配字符串的话,它只会去找字符串中的大写字母。如果加上i修饰符,就表示可以忽略大小写,小写字母也是ok的。

// 没有加i标识符,可以看到它只会匹配字符串中的小写a
let reg = /a/g;  
let str = ‘aAbbcc‘
let strReplaced = str.replace(reg,"G")
console.log(strReplaced)    //  GAbbcc
// 加i标识符,可以看到大写A小写a都会匹配 
let reg = /a/gi;  
let str = ‘aAbbcc‘
let strReplaced = str.replace(reg,"G")
console.log(strReplaced)    //  GGbbcc

  3, 正则表达式有两种基本字符组成,一种是原义文本字符,一种是元字符。原义文本字符,是指这个字符就是它本来的意思。let reg = /a/, a 就是小写字母a, 它也只会匹配小写字母a, 这就是它本来的意思,没有其他任何意思。 元字符,它是指有特殊含义的字符,如\d, 它不是匹配 一根\和小写字母d 的组合,\d 表示的是任意的数字。 正则表达式中有以下元字符:. * ? ^ 等, 也就是说,这些字符都有特殊的意思.

  4, 字符类

  一般情况下,正则表达式在去匹配字符串的时候,都是一个字符一个字符的去匹配,也就是正则表达式中的一个字符对应字符串的一个字符。 但有时候,我们想让正则表达式中的多个字符去匹配一个字符,也就是,我们字符串中只要出现多个字符中一个就算匹配成功。比如,我们只要求字符串中有数字就行,而不管数字是哪个。这时就要用到[], 中括号中的字符,我们字符串中只要出现一个就ok.

// []只要有中括号中的一个字符就算成功。
let reg = /[0123456789]/g;  
let str = ‘a1b2c3d4‘
let strReplaced = str.replace(reg,"G")
console.log(strReplaced)    //  aGbGcGdG

可以看到,只要字符串中有一个数字,就算匹配成功。我们把所有的数字一一列出来,比较麻烦,如果有26个字母,我们要列了26个字母,这更麻烦了。还好正则表达式提供了范围的书写,0-9,a-z ,并且还可以连写。

let reg =[0-9a-zA-z]

   在[]中其实还可以用一个字符,那就是^, 它表示取反。[^0-9] 就表示除了0-9之处的任意字符。[^0-9a-zA-z] 则表示除了0-9,a-z A-Z 之外的任意字符。对于这些常用的表示符,正则表达式也提供了一些预定义类,[0-9]表示数字,就可以用\d 来代替,[^0-9] 表示非数字,可以用\D来代替, 还有\s, \w, \W等。 小写形式是什么,大写形式就是它的取反.

  \d, d是digital 表示数字, 那么\D 则表示不是数字; \s, space 表示空白符, \S就表示非空白符. \w, word, 表示单词字符(字母,数字加下划线), \W 表示非单词字符,这里还有一个 点号 . 它表示除回车和换行符之外的任意字符。我们写一个 ab 开始,后面紧跟数字,再后面是任意字符的正则表达式,let reg = /ab\d./

let reg = /ab\d./g;
let string = ‘there is ab5td and abds ‘
let replaceString = string.replace(reg,"A");
console.log(replaceString)  // there is Ad and abds 

  这个正则表达式区配的是ab5t

  5, 边界类

  边界类主要用四个: ^ 表示以什么开始,$表示以什么结尾, \b, boudary 表示单词边界,\B 表示非单词边界。

  

正则表达式