【前端】:正则表达式

2020-02-19 11:37:19 浏览数 (1)

世界上为什么会有正则表达式这么反人类的玩意儿? ——来自程序员的吐槽

然而事实上,正则表达式并不是每天都会用到,而其密码般的形象,随着时间的推移很容被忘记,所以经常发生的情况是,开发者对于正则表达式的记忆迅速消褪,每次遇到新的问题,都要查资料,重新唤回记忆,对于稍微复杂一点的问题,只好求助于现成的解决方案。反反复复,长期如此,不但应用水平难以明显提升,而且会对这项技术逐渐产生一定的恐惧感和厌烦情绪。 《精通正则表达式》

代码语言:javascript复制
目录
1. 什么是正则表达式?
2. 正则表达式案例分析
    2.1. 移动电话、固定电话
    2.2. IPv4
    2.3. 千位分隔符
3. JS 中的正则操作
    3.1. String 中的正则 API
      3.1.1. String.prototype.match()
      3.1.2. String.prototype.search()
      3.1.3. String.prototype.split()
      3.1.4. String.prototype.replace()
    3.2. RegExp 对象 API
      3.2.1. RegExp.prototype.exec()
      3.2.2. RegExp.prototype.test()
4. 几道笔试题
    4.1. 初级难度
    4.2. 中级难度
    4.3. 细节型题目

1. 什么是 [正则表达式]

  • 正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。
  • 正则表达式是一些用来匹配和处理文本的字符串。

正则为什么不太好学?

正如看到的那样,对正则表达式进行测试是很有技巧的。验证某个模式能不能获得预期的匹配结果并不困难,但如何验证它不会匹配到你不想要的东西可就没那么简单了。 正则表达式必知必会

这里的关键是正则表达式很少有对错之分(当然,前提是它们能解决问题),我们更关心的是它们的复杂程度,而这要由模式匹配操作的精确程度来决定;如果你需要更精确的匹配,就需要构造更复杂的正则表达式。 正则表达式必知必会

想要掌握正则表达式

建议进行系统学习

推荐三本书

2. 正则表达式案例分析

2.1. 移动电话、固定电话

项目实际使用的正则:

改造一波:

  • 移动电话:/^1[3-9]d{9}$/
  • 固定电话:/^(0d{2,3}-)?d{5,8}(-d{1,4})?$/

2.2. IPv4 地址

  • 0~255:/^(d{1,2}|1d{2}|2[0-4]d|25[0-5])$/

完整版:

/^(?:(?:d{1,2}|1d{2}|2[0-4]d|25[0-5]).){3}(?:d{1,2}|1d{2}|2[0-4]d|25[0-5])$/

用例:

2.3. 千位分隔符

千位分隔符,其实就是数字中的逗号,每隔三位数加一个逗号,增强可读性。

正则:

代码语言:javascript复制
function addComma(raw){
  var regex = /(?<=[d])(?=(d{3}) (?![d]))/g;
  return raw.replace(regex, ",");
}

简析:

“,”应该被加到这么一个位置:这个位置右侧的数字个数是3的整数倍(而且再往后不应该再有数字了),这个位置左侧应该还有数字。

用例:

常用正则案例,将持续补充

先写这几个

3. JS 中的正则操作

3.1. String 的正则 API

3.1.1. String.prototype.match()

match() 方法检索返回一个字符串匹配正则表达式的的结果。

示例1:

示例2:

3.1.2. String.prototype.search()

search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。

示例1:

3.1.3. String.prototype.split()

split() 方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。

3.1.4. String.prototype.replace()

replace() 方法返回一个由替换值(replacement)替换一些或所有匹配的模式(pattern)后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。原字符串不会改变。

示例1:

3.2. RegExp 对象 API

RegExp 构造函数创建了一个正则表达式对象,用于将文本与一个模式匹配。

代码语言:javascript复制
// 构造
/pattern/flags
new RegExp(pattern [, flags])
RegExp(pattern [, flags])

// 成员函数
RegExp.prototype.compile() // 已废弃,建议替换为构造函数
RegExp.prototype.exec()
RegExp.prototype.test()

3.2.1. RegExp.prototype.exec()

示例1:

3.2.2. RegExp.prototype.test()

test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。

4. 几道笔试题

4.1. 初级难度

题目01:

题目02:

题目03:

题目04:

题目05:

题目06:

题目07:

题目08:

题目09:

题目10:

题目11:

4.2. 中级难度

题目01:

题目02:

题目03:

题目04:

题目05:

题目06:

题目07:

题目08:

题目09:

3.3. 细节型题目

题目01:

题目02:

题目03:

陷阱: {} 重复次数匹配,不包含 {,n} 语法,合理语法有:{n}、{n,}、{m,n}

知识:懒惰匹配

参考:

《精通正则表达式(第三版)》 《正则指引(第二版)》 《正则表达式必知必会(修订版)》 egrep: http://regex.info/egrep.html String: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/match https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/split https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/search RegExp: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp 牛客网【正则表达式】题库: https://www.nowcoder.com/search?type=question&query=正则表达式

0 人点赞