正则表达式
David糖
这个作者很懒,什么都没留下…
展开
-
07-点操作符
7.1 .可以(几乎)匹配任何字符句点是正则表达式中最常用的字符之一,但是同时它也是最常被用错的元字符之一。句号可以匹配除了行终结符\r\n以外的任何字符。在本教程所涉及的引擎都会默认不匹配行终结符。句号不能匹配行终结符主要是历史原因造成的。因为第一个使用正则表达式的工具是基于行来匹配的,它会把文件按行读取,并用正则匹配每一行。所以每一次匹配中都不包含行终结符,句号也不会去匹配行终结符。现...翻译 2018-12-04 13:48:24 · 373 阅读 · 0 评论 -
11-非必选项
11.1 非必选项我们可以使用?把它之前的token标记为可选的。例如colou?r可以匹配 colour 或者 color。?问号在这里是一种量词。我们可以使用匹配组把多个token标记为非必须的。例如Nov(ember)?可以匹配 Nov 和 November。你可以在一个表达式中使用多个问号,这样可以形成更多种不同的组合。例如Feb(ruary)? 23(rd)?可以匹配Februar...翻译 2018-12-18 16:02:18 · 662 阅读 · 0 评论 -
12-量词
12.1 星号*和加号+之前我们已经介绍过问号?这个量词,引擎会把它之前的token匹配一次或者零次,换句话说问号之前的token是可选的。星号的意思是匹配0次或者多次它之前的token,而加号的意思说匹配1次或者多次。例如<[A-Za-z][A-Za-z0-9]*>可以匹配一个不包含属性的HTML标签。其中尖括号是字面量字符。第一个字符集匹配一个字母。第二个字符集匹配一个字母或是...翻译 2018-12-18 16:05:29 · 318 阅读 · 0 评论 -
15-具名捕获组
大多数正则都支持以数字为标识的捕获组和回溯引用。如果表达式中使用了许多以数字标识的捕获组和回溯引用,那么这将增加阅读表达式的难度。尤其是当你在这种表达式的中间插入或是删除一个捕获组之后,你需要更新所有回溯引用中的数字。在这种情况下你可以使用具名捕获组,从而避免数字发生改动,同时也增加了代码的可读性。15.1 JavaScript中的语法在不同的引擎中,具名捕获组的语法是不同的。在JavaScr...翻译 2019-01-04 09:42:45 · 341 阅读 · 0 评论 -
16-零宽预测回顾断言-part2
16.7 正对同一段字符串使用多个匹配条件预测回顾断言的功能是非常强大的,但很多正则表达式的初学者不懂得充分发挥它的优势,因为这些概念的理解有些难度。最难理解的部分是预测回顾断言是零宽的,所以如果一个表达式中使用了预测回顾断言,那么那部分字符串将会被匹配两次。我们现在用一个实例在说明这个特性。我们现在要匹配一个长度为6的单词,并且这个单词中包含连续的字符串 cat。实际上即使不用预测回顾断言我...翻译 2019-01-17 11:16:17 · 148 阅读 · 0 评论 -
16-零宽预测回顾断言
16.1 预测、回顾零宽断言预测零宽断言、回顾零宽断言和位置字符以及词语边界类似,他们都是零宽的。但是预测、回顾零宽断言实际上会匹配字符,他们仅仅返回匹配是否成功,而忽略匹配到的字符。这就是为什么他们被称为“断言”。预测、回顾断言在匹配的过程中不消耗任何字符,它们仅仅断言匹配是可能的还是不可能。预测、回顾断言所提供的功能无法使用其他token替代,或者说如果使用其他方法表达式会变得很复杂。16...翻译 2019-01-13 11:30:13 · 405 阅读 · 3 评论 -
18-正则匹配数字范围
1. 正则匹配数字范围正则表达式是为了匹配字符而设计的,而并不是为了匹配数字,所以当你使用正则匹配指定范围内的数字的时候你需要额外小心。表达式[0-255]并不能匹配0至255之间的数字。表达式[0-255]是一个字符集,它的含义是匹配 0,1,2,5中任意一个字符,这个表达式等同于[0125]。正则引擎真正处理的是字符,所以数字0对于引擎来说是一个字符,而255对于引擎来说是长度为3的字符。...翻译 2019-02-01 18:50:28 · 34987 阅读 · 1 评论 -
19-正则匹配浮点数?又是一道送命题
在这个例子中,我们将展示正则表达式初学者所常犯的错误,以及避免的方法。下面这个例子我们将匹配一个浮点数,这个表达式也可以匹配整数以及省略整数部分的浮点数。它不会匹配带有指数符号的浮点数例如1.5e8。乍看之下答案可能是:[-+]?[0-9]*\.?[0-9]*。这个表达式中首先定义了一个可选的正数负数符号,接下来是一组可选的整数,一个可选的小数点,最后是另一组可选的整数。这个表达式中的每一个部...翻译 2019-02-01 18:52:43 · 3471 阅读 · 2 评论 -
20-正则邮箱匹配技巧
邮箱匹配是非常常用的,历史上邮箱名称的规则发生过很多次变化,所以没有哪一个正则表达式可以100%的匹配所有的邮箱。根据不同的邮箱名称规则我们可以对表达式作出调整,这样我们可以得到一个能匹配绝大多数邮箱的表达式。例如我们可以使用\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b在文本中搜索邮箱地址。注意使用这个表达式的时候需要关闭大小写敏感的模式。这个表达式使用了词...翻译 2019-02-16 07:59:11 · 1187 阅读 · 0 评论 -
21-正则表达式应用:日期匹配技巧
^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$可以匹配格式为yyyy-mm-dd的日期,并且兼容四种分割符,它匹配的范围是1900-01-01到2099-12-31。这个表达式的前后都使用了位置字符以确保整个字符串仅包含一个完整的日期。年份匹配我们使用(19|20)\d\d来匹配日期中的年份,这个表达使用选择符来...翻译 2019-03-06 22:35:30 · 3537 阅读 · 0 评论 -
14-回溯引用
14.1 使用回溯引用匹配出现过的字符串回溯引用可以匹配到捕获组曾经匹配过的结果。你可以使用它来匹配HTML的开启标签和闭合标签、以及他们之间的文本。我们可以把启示标签放入一对花括号中(创建捕获组),这样我们在匹配闭合标签的时候可以再次使用捕获组所匹配到的字符。表达式如下<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>。这个表达式中只有一对圆括号,...翻译 2018-12-26 15:03:45 · 841 阅读 · 1 评论 -
13-匹配组
13.1 匹配组你可以在表达式中使用圆括号来创建一个匹配组,匹配组中的内容将作为一个整体来看待。我们可以对一个匹配组使用量词,或是使用匹配组来限制选择符所能到达的范围。只有圆括号才能形成匹配组。方括号是定义字符集,花括号是定义量词。13.2 创建捕获组你也可以使用圆括号()创建一个以数字命名的捕获组。捕获组所匹配到的内容将被引擎保存起来。例如表达式Set(Value)?可以匹配 Set ...翻译 2018-12-26 15:01:12 · 343 阅读 · 0 评论 -
09-词语边界
元字符\b和^$一样也是一个位置字符。它也是一个零宽的匹配字符,它匹配的是词语边界。词语边界可以匹配三种不同的位置:匹配字符串中第一个字符之前的位置,如果第一个字符属于词语字符(word character)匹配字符串中最后一个字符之后的位置,如果最后一个字符是词语字符匹配两个字符之间的位置,如果其中一个是词语字符而另一个不是。我们可以使用\b匹配字符串中的单词,例如\bword\b...翻译 2018-12-08 23:11:44 · 424 阅读 · 0 评论 -
05-字符类(Character Classes)
5.1 字符类(字符集)字符类(也叫字符集),它的作用是匹配一组字符中的一个字符。字符集的语法很简单,只要把字符写到方括号中间就可以了。例如[ae]可以匹配a或者e。你可以用gr[ae]y匹配gray或者grey。gray是美式英语,grey是英式英语。一个字符集只能匹配一个字符。例如gr[ae]y不能匹配graay或者graey。字符集中的字符排序是不分先后的,不同的顺序匹配结果是一样的。...翻译 2018-11-30 10:26:57 · 597 阅读 · 0 评论 -
专题简介
这个系列的文章是为了向你介绍正则表达式引擎的工作原理,懂得这些原理是写出高效的正则表达式的关键。不仅如此这还将帮助你避免很多常见的错误,减少你花在猜测正则表达式的行为的时间。作者译:文章中很多带有链接的文字没有翻译成中文,这是因为我还没有对链接中的文章进行详细的理解,为了避免翻译出现错误我保留了英文。等到我翻译完成之后我会把标题和链接都替换成中文。笔者邮箱:billl89@126.com欢迎来...翻译 2018-11-28 09:05:47 · 483 阅读 · 0 评论 -
01-专题目录
我将向你介绍正则表达式的方方面面。下面每一章节的内容都是建立在之前章节之上的,所以你需要按序阅读下面的章节。1. 介绍这一章将介绍本教程的内容范围,以及正则的一些名词解释。2. 字面量字符与元字符最基础的正则表达式是由字面量字符组成的。有些字符具有特殊的含义,在使用的时候需要转义,我们称它们为元字符。而元字符是正则中较为复杂的部分。3. 非打印字符非打印字符是诸如换行符、回车符、制表符...翻译 2018-11-28 09:09:26 · 236 阅读 · 0 评论 -
02-字面量字符与元字符
2.1. 字面量字符(Literal Characters)最基础的正则表达式由一个字面量字符组成,例如a。它将匹配一个字符串中第一个a出现的位置。如果它匹配的是Jack is a boy,那么它将匹配到J后面的a。事实上即使a出现在字符串的中间也不影响这个正则,如果你想控制a是否出现在字符串的开头或者结尾,那么你需要使用文字边界。我们会在后面的章节展开讨论。事实上这个正则同样可以匹配字符串中...翻译 2018-11-28 09:13:16 · 205 阅读 · 0 评论 -
03-非打印字符
你可以在正则表达式的特殊字符匹配非打印字符。\t:匹配制表符\r:匹配回车\n:匹配换行\a:匹配响铃\e:匹配esc键\f:匹配分页符在windows中使用\r\n在结束一行,而UNIX中使用\n3.1 行终结符(Line Breaks)\R是一个特殊的转义符,它将匹配所有的行终结符,也包括Unicode行终结符。相对于\r或者\n,\R比较特殊的一点是它会把CRLF对...翻译 2018-11-28 09:17:55 · 799 阅读 · 0 评论 -
04-正则引擎内部初探
理解正则引擎的内部原理将帮助你写出更高效的表达式,并且帮助你快速调试正则表达式中的异常在接下去的章节中每当我们介绍一个新的正则token,我们都会解释正则引擎是如何处理这个token的。虽然理解引擎的原理有些难度,但是它可以帮助我们避免一些常见的错误。4.1 引擎的分类虽然正则引擎有很多种不同的实现,但是大体可以分为两类:文本驱动的引擎(text-directed)和正则驱动的引擎(rege...翻译 2018-11-28 09:19:07 · 204 阅读 · 0 评论 -
06-字符集的缩写
6.1 字符集的缩写有些字符集使用的频率很高,所以在正则引擎中我们使用缩写的形式来代表这些组合,这样可以提高效率。6.1.1 \d例如\d代表[0-9],在大多数支持Unicode的引擎中,\d代表所有的数字(包含Unicode形式)。但是也有例外在java和javascript中\d只包含ASCII字符的数字。6.1.2 \w\w代表文字字符,也就是[A-Za-z0-9_]。6.1....翻译 2018-12-03 09:31:04 · 333 阅读 · 0 评论 -
08-位置字符
8.1 位置字符目前为止我们已经学习了字面量字符,字符集,句号这些元字符。它们可以匹配到单个字符。位置字符的规则和之前学习的元字符有很大的区别。位置字符不匹配任何字符,它匹配的是位置,可能位于字符串的开始、中间、结尾。它可以匹配的结果锚定在字符串的特殊位置。脱字符^可以匹配字符串的开始位置。例如^a可以匹配abc中的a,而^b不能匹配abc中的任何字符,因为b不在字符串的起始位置。下面我们会解...翻译 2018-12-08 12:38:04 · 401 阅读 · 0 评论 -
10-选择符
10.1 选择符在第五章中,我们已经学习了字符集,它可以匹配多个字符中的一个字符。选择符和字符集很类似,它可以匹配多个表达式中的任意一个字符。如果你想搜索多个文本,例如cat或者dog,你可以使用竖线来分隔这两个文本:cat|dog。如果你想要更多的选项,你可以对上面的例子进行扩展:cat|dog|mouse|fish。选择符的优先级在所有的正则操作符中是最低的。所以引擎会匹配竖线左侧所有的...翻译 2018-12-12 18:42:50 · 295 阅读 · 0 评论 -
22-正则高级应用:匹配一行完整的字符串
这一章中我会学习如何根据特定的条件从文件中匹配完整的一行字符串。例如指定包含一组单词,或者指定不包含一组单词。我们会用到正则的预测断言特性。翻译 2019-03-09 19:41:49 · 12221 阅读 · 0 评论