专栏首页京程一灯讲给前端的正则表达式(1):基本概念

讲给前端的正则表达式(1):基本概念

翻译:疯狂的技术宅

作者:wanago

来源:wanago.io

正则表达式(regex)是定义搜索模式的字符序列。由于对程序员的日常工作非常有用,所以在 JavaScript 中也支持它。在这个系列文章中,我会向你展示其工作方式以及其实际用途。希望在结束本系列后,你将能够轻松的写出自己的正则表达式。

创建正则表达式的方法

在 JavaScript 中可以通过两种方式去构造正则表达式。要完全理解它,你需要知道正则表达式包含在两个正斜杠中。尽管这并不是模式中的一部分,但它们用来指示模式的开始和结束。通过它们可以告诉 JS 解释器它正在处理正则表达式:

const regex = /dog/;

另一种方式是使用 RegExp 构造函数:

const regex = new RegExp('dog');

创建对象之后,你可以在对象上调用 test 方法,方法得到字符串后,如果模式匹配,则返回 true

regex.test('dog'); // true
regex.test('hot-dog'); // true

简单模式

这是正则表达式最简单的类型。能够直接在字符串中找到匹配的类型。/dog/ 仅在字符以相同顺序一起出现时才会匹配。

/dog/.test('hot-dog'); // true
/dog/.test('do games'); // false

但是正则表达式的功能绝不会这么简单。在许多情况下你可能会希望使用更复杂的模式。

特殊字符

除了寻找某个字符串的简单出现,还可以做更多的事情。一种方法是使用特殊字符。它们不会被解释为被搜索字符串的直接内容,但能够以通用的方式对其进行描述。

任何字符

它由一个点 . 表示。用来匹配除了换行符以外的任何单个字符。

const regex = /.og/;
regex.test('fog'); // true
regex.test('dog'); //true

通配符是特殊字符之一。如果想要匹配的是一个点 . 字符该怎么办?

反斜杠

反斜杠 / 用于将特殊字符的含义切换为普通字符。所以是可以在文本中搜索点 . 字符的,并且这个点不会被解释为特殊字符。

const regex1 = /dog./;
regex1.test('dog.'); // true
regex1.test('dog1'); // true

const regex2 = /dog\./;
regex1.test('dog.'); // true
regex1.test('dog1'); // false

字符集

用方括号 [ ] 表示。这个模式用来匹配一个字符,该字符可能是括号中的任何字符。

/[dfl]og/.test('dog'); // true
/[dfl]og/.test('fog'); // true
/[dfl]og/.test('log'); // true

需要注意的是字符集内的特殊字符(如点 .)不再特殊,因此在这里不再需要反斜杠。我们甚至可以进一步定义一些字符:

/[A-z]/.test('a'); // true
/[A-z]/.test('Z'); // true

请注意,在字母范围方面,大写字母优先。这意味着 /[a-Z]/ 会引发错误。

const pattern = /[a-Z]/;

Uncaught SyntaxError: Invalid regular expression: /[a-Z]/: Range out of order in character class

你可以通过添加 ^ 符号轻松获得否定字符集。它会匹配方括号中未包含的所有内容。

/[^df]og/.test('dog'); // false
/[^df]og/.test('fog'); // false
/[^df]og/.test('log'); // true

一个重要的注意事项:[A-z] 范围实际上将匹配多个字母。正如你在 ASCII 表上看到的那样,[A-z] 也将与符号[\]^_` 相匹配,所以请谨慎使用 [A-Za-z],而是使用标志来忽略大小写。

多次重复

一个非常有用的功能是匹配某个表达式出现的确切次数。你可以用花括号 { } 来实现。让我们创建一个函数,该函数将检查字符串是否为有效的电话号码。以下面的格式为例:

+xx xxx xxx xxx

其中 x 是 0 到 9 之间的数字。

function isPhoneNumber(number){
    return /\+[0-9]{2} [0-9]{3} [0-9]{3} [0-9]{3}/.test(number);
}

isPhoneNumber('+12 123 123 123'); // true
isPhoneNumber('123212'); // false

请注意,我们在此处进行了一些自定义:

  • {x} 完全匹配 x 次出现
  • {x,} 至少匹配 x 次
  • {x,y} 至少匹配 x 次且不超过 y 次

零个或多个重复

带有星号 * 的表达式可以匹配 0 次或更多次。它实际上等效于 {0,}

这样我们可以轻松构造一个可以匹配任意数量字符的模式:/.*/

标志

你可以在正则表达式中再添加一个模式。标志是一种影响搜索的修饰符。如果用斜杠定义正则表达式的话,就在斜杠后添加它们。如果用 RegExp 构造函数,则将它们作为第二个参数。最重要的标志是:

i:忽略大小写

使用这个标志,搜索时不区分大小写:

/dog/i.test('dog'); // true
new RegExp('dog', 'i').test('DoG');

就这么简单!

g:全局匹配

多亏了这个标志,所有匹配项都能够被找到。如果没有它,将会在找到第一个匹配项后停止。

String.prototype.replace

你很快就能掌握它,因为你可能已经知道函数 replace。它会返回一个新字符串,如果字符串的内容能够与模式匹配,则会替换其内容。你可以使用字符串或正则表达式之类的模式。但棘手的是如果你用字符串去执行这个操作,则无法替换所有出现的模式,只能替换一个模式。如果使用前面提到的标志,就可以轻松地处理:

const lorem = 'lorem_ipsum_dolor_sit_amet';

lorem.replace('_', ' '); // 'lorem ipsum_dolor_sit_amet'

lorem.replace(/_/g, ' '); // 'lorem ipsum dolor sit amet'

在下一篇文章中,我们将会讨论更多的标志。

总结

有了所有这些信息,你就可以开始编写自己的正则表达式并将其使用。我强烈建议你使用这个很棒的工具【https://regex101.com/】,它会为你提供帮助。在本文的后续部分中,当正则表达式可以发挥更大作用时,我们将会学习更多高级概念,包括更深入地研究 JavaScript 提供的 RegExp 对象。到那时,试着练习已经掌握的知识,你将会真正领略到正则表达式的强大。下次见!

原文:https://wanago.io/2018/04/30/regex-course-part-one-basic-concepts/

本文分享自微信公众号 - 前端先锋(jingchengyideng)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 标准的Promise

    不同项目下lib里的promise/deferred往往是差异化最多的,用起来和自己的习惯相比经常是缺胳膊少腿多屁眼有卵用,因此聊聊标准的Promise的啥样的

    IMWeb前端团队
  • 走进Golang之运行与Plan9汇编

    通过上一篇走进Golang之汇编原理,我们知道了目标代码的生成经历了那些过程。今天我们一起来学习一下生成的目标代码如何在计算机上执行。以及通过查阅 Golang...

    用户3160618
  • Promise接口实现之jQuery 的deferred对象

    我们知道JavaScript是单线程,如果遇到某些耗时很长的javascript操作,那么其他的操作就必须等待。,通常的解决方法是将那些排在后面的操作,写成“回...

    IMWeb前端团队
  • 从smart漫谈打包

    项目构建迁移到fis体系后,打包的问题就跟着来了。打包的基本方式是:分析依赖,合并文件,解决引入。

    IMWeb前端团队
  • 使用时间戳生成唯一主键

    时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名...

    李郑
  • 简单介绍下modJS

    近期把团队的项目构建迁移到fis3,同时把模块加载器也由之前的requirejs切换到了modJS。

    IMWeb前端团队
  • React同构思想

    React比较吸引我的地方在于其客户端-服务端同构特性,服务端-客户端可复用组件,本文来简单介绍下这一架构思想。

    IMWeb前端团队
  • ionic hybrid app:产品还是玩具?

    提到跨终端应用开发,很容易想到最近很火的React Native。使用React Native开发出的APP本质上是Native APP。在跨端应用开发这一领域...

    IMWeb前端团队
  • 基于Senparc开发微信公众号

    Nuget 安装 Senparc SDK ,这里采用 .NET Core MVC WEB API 来开发。

    李郑
  • Promise原理浅析

    Promise 对象用于延迟(deferred) 计算和异步(asynchronous ) 计算.。一个Promise对象代表着一个还未完成,但预期将来会完成的...

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券