正则表达式

正则表达式

Tags : 正则


引言

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

所以我们判断一个字符串是否是合法的Email的方法是:

  1. 创建一个匹配Email的正则表达式;

  2. 用该正则表达式去匹配用户的输入来判断是否合法。

因为正则表达式也是用字符串表示的,所以,我们要首先了解如何用字符来描述字符。

精确匹配

在正则表达式中,如果直接给出字符,就是精确匹配。所以:

  • \d可以匹配一个数字
  • \w可以匹配一个字母或数字
  • \s可以匹配一个空格(也包括Tab等空白符)
  • . 可以匹配一个任意字符
  • \-可以匹配'-'这个特殊字符(同《》,.<>?/;这些字符用'\'转义来匹配)

示例:

  • '00\d'可以匹配'007',但无法匹配'00A'

  • '\d\d\d'可以匹配'010'

  • '\w\w\d'可以匹配'py3'

.可以匹配任意字符,所以:

  • 'py.'可以匹配'pyc''pyo''py!'等等。

范围匹配

  • *表示任意个字符(包括0个)
  • +表示至少一个字符
  • ?表示0个或1个字符
  • {n}表示n个字符
  • {n,m}表示n-m个字符
  • []表示范围(0-9a-zA-Z\_
  • ^xxx 表示以xxx为开头
  • xxx$ 表示以xxx为结尾
  • p|P 表示phonePhone匹配
  • () 表示分组

来看一个复杂的例子:\d{3}\s+\d{3,8}

我们来从左到右解读一下:

\d{3}表示匹配3个数字,例如'010'

\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' '' '等;

\d{3,8}表示3-8个数字,例如'1234567'

综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。
但是,仍然无法匹配'010 - 12345',因为带有空格。所以我们需要更复杂的匹配方式。

[]表示范围,比如:

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100''0_Z''Py3000'等等;

[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

你可能注意到了,py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。

正则

  • 以@Column开头的行 @Column.*$
  • 去除空行 ^\s*\n
  • 去除注释/**/ /\*{1,2}[\s\S]*?\*/
  • 去除注释// //.*$
  • 全角字符[^\x00-\xff] [\uFE30-\uFFA0]
  • 半角字符 [\x00-\xff]

速查


 a|b      匹配 a 或 b
 gr(a|e)y 匹配 gray 或 grey
 .        匹配任一字符
 [abc]    匹配任一字符: a 或 b 或 c
 [^abc]   匹配任一字符, 但不包括 a, b, c
 [a-z]    匹配从 a 到 z 之间的任一字符
 [a-zA-Z] 匹配从 a 到 z, 及从 A 到 Z 之间的任一字符
 ^        匹配文件名的头部
 $        匹配文件名的尾部
 ( )      匹配标记的子表达式
 \n       匹配第 nth 个标记的子表达式, nth 代表 1 到 9
 \b       匹配字词边界
 *        匹配前一项内容 0 或多次
 ?        匹配前一项内容 0 或 1 次
 +        匹配前一项内容 1 或多次
 *?       匹配前一项内容 0 或多次 (懒人模式)
 +?       匹配前一项内容 1 或多次 (懒人模式)
 {x}      匹配前一项内容 x 次
 {x,}     匹配前一项内容 x 或多次
 {x,y}    匹配前一项内容次数介于 x 和 y 之间
 \        特殊转义字符
posted @ 2021-03-31 19:26  Victor-Wei  阅读(48)  评论(0编辑  收藏  举报