第五章(3):正则表达式

作者: 日暮途远_ | 来源:发表于2017-06-15 18:11 被阅读22次

正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

ECMAScript通过RegExp类型来支持正则表达式。

创建正则表达式

创建正则表达式有两种方式。通过构造函数和字面量的方式。如下:

var reg = /hello/ // 字面量
var regexp = new RegExp("hello")  // 构造函数
元字符

元字符包括: ( [ { \ ^ $ * + ? . | } ] )。这些字符在正则中有特殊的用途。如果要匹配的字符串中包括这些符号的话,必须通过 \ 来转义。例如:

var pattern = /[a-z]/
var pattern1 = /\[a-z\]/
console.log(pattern.exec('adf'))    // ["a", index: 0, input: "adf"]
console.log(pattern1.exec('adf'))   // null

console.log(pattern.exec('[a-z]'))  // ["[a-z]", index: 0, input: "[a-z]"]
console.log(pattern1.exec('adf')) // null
正则表达式的标识
  1. g 全局模式
var regG = /m/g
console.log(('my name is Test').match(regG))  // ["m", "m"]
console.log(regG.exec('my name is Test')) // ["m", index: 0, input: "my name is Test"]
  1. i 不区分大小写
// i 不区分大小写
var regI = /h/i
console.log(regI.test('He'))  // true
正则表达式的方法
  1. test
// test 测试字符串是否匹配正则表达式,返回true或者false
var reg = /^(\d{3}-\d{4}-\d{4})$/
console.log(reg.test('187-0127-9074'))  // true
console.log(reg.test('187-0127-90745asd'))  // true
  1. replace
// replace 字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
var strRe = ("187-0127-9074").replace(reg, '电话号码')
console.log(strRe)  // 电话号码
  1. exec和match

exec和match有些类似。exec是正则表达式的方法,match是字符串的方法。exec和match都会返回数组。但是在使用g标志的时候,match会返回一个数组,包括所有匹配的字符串。而exec只会返回第一个匹配的字符。

exec返回包含一个匹配信息的数组,如果没有匹配则返回null。数组是Array的实例。包含额外两个属性:index和input。index表示匹配的字符串的索引值,input表示应用正则的字符串。数组中的第一项是匹配的字符串,第二项至第N项是捕获括号中对应的字符串的值。如果没有捕获括号,则只有第一项。match在不带g标识的时候表现和exec类似。

exec

// exec 在字符串中查找是否匹配,返回一个数组。找不到则返回null.
var reg = /^(\d{3}-\d{4}-\d{4})$/
console.log(reg.exec('187-0127-9074187-0127-9074')) // null
console.log(reg.exec('187-0127-9074'))  // ["187-0127-9074", "187-0127-9074", index: 0, input: "187-0127-9074"]

match

// match 在字符串中查找是否匹配,返回一个数组。找不到则返回null。
console.log(('187-0127-9074187-0127-9074').match(reg)) // null
console.log(('187-0127-9074').match(reg))  // ["187-0127-9074", "187-0127-9074", index: 0, input: "187-0127-9074"]

exec和match的区别

// g 全局模式
var regG = /m/g
console.log(('my name is Test').match(regG))  // ["m", "m"]
console.log(regG.exec('my name is Test')) // ["m", index: 0, input: "my name is Test"]
正则表达式的特殊变量
//使用特殊字符
  /**
   * ^ 匹配输入的开始
   * \ 将特殊字符转义为普通字符
   * @type {RegExp}
   */
  var reg1 = /^123/g
  console.log(reg1.exec('123456'))  // ["123", index: 0, input: "123456"]
  var reg1_1 = /\^123/g
  console.log(reg1_1.exec('123456'))  // null
  console.log(reg1_1.exec('^123456 ^1234 ^1235'))  // ["^123", index: 0, input: "^123456"]

  // $ 匹配输入的结束
  var reg2 = /fan$/
  console.log(reg2.exec('test fan'))  // ["fan", index: 5, input: "test fan"]
  console.log(reg2.exec('test fanc'))  // null

  // * 匹配前一个表达式0次或者多次,等价于{0,}
  var reg3 = /re*/
  console.log(reg3.exec('great')) // ["re", index: 1, input: "great"]
  console.log(reg3.exec('grceat'))  // ["r", index: 1, input: "grceat"]

  // + 匹配前一个表达式1次或者多次,等价于 {1,}
  var reg4 = /l+/
  console.log(reg4.exec('I like lol')) // ["l", index: 2, input: "I like lol"]

  // ? 匹配前一个表达式0次或者1次。等价于 {0,1}
  var reg5 = /a?b/
  console.log(reg5.exec('abcd'))  // ["a", index: 0, input: "abcd"]
  console.log(reg5.exec('bcd')) // ["b", index: 0, input: "bcd"]

  // . 匹配除换行符之后的任何单个字符
  var reg6 = /.e/
  console.log(reg6.exec('e')) //  null
  console.log(reg6.exec('love'))  // ["ve", index: 2, input: "love"]

  // (x) 匹配x并记住匹配项,括号被称为 捕获括号
  var reg7 = /(a)(b)+/
  console.log(reg7.exec('a')) // null
  console.log(reg7.exec('abc')) // ["ab", "a", "b", index: 0, input: "abc"]

  // (?:x) 匹配 'x' 但是不记住匹配项。
  var reg8 = /(?:name){1,2}/
  console.log(reg8.exec('name123'))   // ["name", index: 0, input: "name123"]

  // x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。
  var reg9 = /name(?=tiptoe)/
  console.log(reg9.exec('nametiptoe123')) // ["name", index: 0, input: "nametiptoe123"]
  console.log(reg9.exec('namet123'))  // null

  // x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。
  var reg10 = /name(?!tiptoe)/
  console.log(reg10.exec('nametiptoe')) // null
  console.log(reg10.exec('namet123')) // ["name", index: 0, input: "namet123"]

  // x|y 匹配x或者y
  var reg11 = /yes|no/
  console.log(reg11.exec('yeno')) // ["no", index: 2, input: "yeno"]
  console.log(reg11.exec('yesn')) // ["yes", index: 0, input: "yesn"]

  // {n} 匹配了前面一个字符刚好发生了n次。
  var reg12 = /1{2}/
  console.log(reg12.exec(1))  // null
  console.log(reg12.exec(11)) // ["11", index: 0, input: "11"]

  // {n,m} 匹配前面的字符至少n次,最多m次。
  var reg13 = /1{1,5}/
  console.log(reg13.exec(123456)) // ["1", index: 0, input: "123456"]
  console.log(reg13.exec(111111111123456))  // ["11111", index: 0, input: "111111111123456"]

  // [xyz] 一个字符集合。匹配方括号的中任意字符,包括转义序列。 你可以使用破折号(-)来指定一个字符范围。
  var reg14 = /[a-z]/
  console.log(reg14.exec('abc123def'))  // ["a", index: 0, input: "abc123def"]
  console.log(reg14.exec('123'))  // null

  // [^xyz] 反向字符集合
  var reg14 = /[^a-z]/
  console.log(reg14.exec('abc123def'))  // ["1", index: 3, input: "abc123def"]
  console.log(reg14.exec('123'))  // ["1", index: 0, input: "123"]

  // /d 匹配一个数字 等价于[0-9]
  var reg15 = /\d/
  console.log(reg15.exec('0123zzz'))  // ["0", index: 0, input: "0123zzz"]
  console.log(reg15.exec('zzz'))  // null

  // /D 匹配一个非数字 等价于[0-9]
  var reg16 = /\D/
  console.log(reg16.exec('0123zzz'))  // ["z", index: 4, input: "0123zzz"]
  console.log(reg16.exec('zzz'))  // ["z", index: 0, input: "zzz"]

  // \w 匹配一个单字字符(字母、数字或者下划线)。 等价于[A-Za-z0-9_]。
  var reg17 = /\w/
  console.log(reg17.exec('@#')) // null
  console.log(reg17.exec('_123')) // ["_", index: 0, input: "_123"]

  // \W 匹配一个非单字字符。 等价于[^A-Za-z0-9_]。
  var reg18 = /\W/
  console.log(reg18.exec('@#')) // ["@", index: 0, input: "@#"]
  console.log(reg18.exec('_123')) // null

引用

相关文章

  • 正则表达式系列-1

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 什么是正则表达式 正则表达式就是用事先定...

  • 《岳响河》目录 第五章

    第五章1 第五章2 第五章3 第五章4 第五章5 第五章6 第五章7 第五章8 第五章9 第五章10 第五章11 ...

  • 5: 正则表达式 + 三剑客之grep

    3 正则表达式 正则表达式元字符分类: 字符匹配 次数匹配 位置锚定 分组 基本正则表达式: vim, grep,...

  • 正则表达式系列-2

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 限定符(重复) 你已经看过了前面的*,+...

  • 第五章(3):正则表达式

    正则表达式 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Ex...

  • iOS正则表达式

    正则表达式写法:OC的正则表达式(RegularExpression)OC的正则表达式本文主要绍介在OC的以下3个...

  • 正则表达式

    1 正则表达式 2 元字符介绍 3 BRE 和 ERE 1 BRE(基础正则表达式) 2 ERE (扩展正则表达式...

  • 正则表达式

    正则表达式的步骤:1,正则表达式的编译2,正则表达式的匹配字符串3,结果的处理

  • 正则表达式系列-3

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 反义 有时需要查找 不属于某个能简单定义...

  • 正则表达式系列-4

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 贪婪与懒惰 贪婪匹配:匹配尽可能多的字符...

网友评论

    本文标题:第五章(3):正则表达式

    本文链接:https://www.haomeiwen.com/subject/xheuqxtx.html