理解正则表达式

posts/%E7%90%86%E8%A7%A3%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

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

基本概念

Boolean “or”

|用于多组匹配。例如gray|grey匹配单词 gray 或单词 grey。

Grouping

()用于定义运算符号范围与优先级,例如gr(a|e)y等同与上文gray|grey

Quantification

  • ?匹配前面出现的元素零次或一次。例如colou?r可以匹配单词 color 或 colour。
  • *匹配前面出现的元素零次或多次。例如ab*c可以匹配 ac,abc,abbc,abbbc 等。
  • +匹配前面出现的元素一次或多次。例如ab+c可以匹配 abc,abbc,abbbc 而不会匹配 ac。
  • {n}匹配前面出现的元素 n 次。
  • {min,}匹配前面出现的元素至少 min 次。
  • {,max}匹配前面出现的元素至多 max 次。
  • {min,max}匹配前面出现的元素次数在 min 和 max 范围内。

Wildcard

.匹配任何字符(换行符除外)。 例如a.b可以匹配 aab,abb,acb,adb 等。

语法

Delimiters

/用于各模式间的分隔。

Metacharacter

  • ^ 匹配字符串中的起始位置。
  • $匹配字符串的结束位置或字符串结束换行符之前的位置。
  • [ ] 匹配括号内的单个字符。例如[abc]匹配字符 a 或 b 或 c。[a-c]匹配字符 a 到字符 z 内的所有单词。
  • [^ ]匹配括号内以外的单个字符。
  • \d 匹配数字字符。
  • \D 匹配非数字字符。
  • \w 匹配单词字符,等价于[A-Za-z0-9_](注意 Unicode 正则表达式会匹配中文字符)。
  • \W 匹配非单词字符,等价于^[A-Za-z0-9_]
  • \s 匹配空白字符(空格,换行,TAB 等)。
  • \S 匹配非空白字符。
  • \b 匹配一个单词边界。例如er\b可以匹配 never 中的 er,但不能匹配 verb 中的 er。
  • \B 匹配非单词边界。例如er\b能匹配 verb 中的 er,但不能匹配 never 中的 er。
  • \f 匹配一个换页符。
  • \n 匹配换行符。
  • \t 匹配制表符。
  • \v 匹配垂直制表符。

贪婪与非贪婪匹配

贪婪标识符:+?*{n}{n,}{n,m}

非贪婪标识符:+???*?{n}?{n,}?{n,m}?

提取 HTML 标签。

<div><span>span1<span/><span>span2<span/></div>
<div><span>span3<span/><span>span4<span/></div>

贪婪匹配<div>.*<\/div>会匹配所有元素。

非贪婪匹配<div>.*?<\/div>会匹配<div><span>span1<span/><span>span2<span/></div><div><span>span3<span/><span>span4<span/></div>