Skip to content

Latest commit

 

History

History
164 lines (83 loc) · 4.38 KB

2014-10-31-regexp.md

File metadata and controls

164 lines (83 loc) · 4.38 KB
layout date title tags
post
2014-10-23 21:37:48 +0800
regexp_reference
regexp

基础符号

字符串字面值(string literal),来匹配目标字符串的。所谓字符串字面值,就是字面上看到的值.

使用符号

? 表示    可选
+  一个或多个    
*  0或多
|  选择,or
\  转义

匹配数字: \d ,要匹配非数字字符,可使用包含以下大写字母 D 的简写式:\D。

\D 匹配非数字,同时包括空格(含回车换行)和标点。

\D 与\w 的区别是

\D 会匹配空格、标点符号(引号、连字符、反斜杠、方括号)等字符,而\w 却不会.

\w 匹配 数字,字母和下划线

\W 匹配 空格,标点 和 非字母,非数字

\D 和 \W 的共同点是:都可以匹配空格和标点

\s 空白符,空白不是空格,匹配 换行 和 空格,它会匹配:
  1. 空格
  2. 制表符(\t)
  3. 换行符(\n)
  4. 回车符(\r)

[ \t\n\r]

表示相同。

. 点号 可以 排除行结束符之外的所有字符

[\w\W] 与 .* 的区别  

[\w\W] 用了互补的集合,来表示“任意字符”,这里和.(点)的概念差不多,但.(点)在默认的情况下是不支持换行符的,用[\w\W]就可以匹配任意的字符,也包括换行符;

匹配单词的边界 \b

简写式\b匹配单词边界,不消耗任何字符; 可以用在从多个单词中查找指定单词,特点是单词周围是空格,所以如果 配置文章中的单词用这个 \bxyz\b, 可以免去 axyz 这种巧合,单独的匹配 单词 xyz。

.+ 可以用于计算行数,简单至极! 原因是点号通常不会匹配折行符,例如换行符(U+000A)或回车符(U+000D)

sed 是Unix 流编辑器,它支持用正则表达式转换文本。

断言

断言标记边界,但是并不耗用字符.

字符并不会返回到结果中。断言也被称做零宽度断言(zero-widthassertion)。零宽度断言不匹配字符,而是匹配字符串中的位置。

其中的一些,比如^ 和$,也叫做锚位符(anchor) ^ 会匹配行或者字符串的起始位置

.^$*+?|(){}[]\-

这15 个元字符在正则表达式中有特殊含义,用来编写匹配模式。

如果你在RegExr 上方的文本框中尝试匹配这些字符,则不会看到任何结果.

因为RegExr 会认为这是个正则表达式而不是字符串字面值。现在试一下 \Q$\E

它将匹配$,因为\Q 和\E 之间的任意字符都会被解释为普通字符。

捕获分组和向后引用

当一个模式的全部或者部分内容由一对括号分组时,它就对内容进行 捕获并临时存储于内存中。

量词

贪心、懒惰、占有

量词自身是贪心的。贪心的量词会首先匹配整个字符串。尝试匹配时,它会选定尽 可能多的内容,也就是整个输入。

量词首次尝试匹配整个字符串,如果失败则回退一个字符后再次尝试。这个过程叫做回溯(backtracking)。

它会每次回退一个字符,直到找到匹配的内容或者没有字符可尝试为止。

懒惰(有时也说勉强)的量词则使用另一种策略。

它从目标的起始位置开始尝试寻找匹配,每次检查字符串的一个字符,寻找它要匹配的内容,最后,它会尝试匹配整个字符串。

比如 在 666666 在匹配 6{2,6}, 既可以2个6 就能匹配,也可以6个6才匹配,懒惰就去用两个6去匹配,贪心就去母串中匹配直到6个6.

要使一个量词成为懒惰的,必须在普通量词后添加一个问号(?)。它每次只“吃”一点。

环视是一种非捕获分组,它根据某个模式之前或之后的内容匹配其他模式。环视也 称为零宽度断言。

正前瞻

a(?=b) 匹配:

cabd

只有匹配模式的第一部是被标亮的,环视模式不会标亮。用于前面匹配的要求(帮助把关),但是不会作为匹配。

反前瞻

反前瞻是对正前瞻的取反操作。这意味着要匹配某个模式时,需要在它后面找不到 含有给定前瞻模式的内容。

a(?!b) 匹配:

aab

sdavdabd

必须满足匹配部分要匹配,但不要匹配括号里的内容。

正后顾(正后顾不适用于 javascript)

(?<=a)b

abc

aabd

反后顾(反后顾不适用于 javascript)

(?<!a)b