手把手教你写正则表达式

1 什么是正则表达式 正则表达式是一种被用于从文本中检索符合某些特定模式的文本。 正则表达式是从左到右来匹配一个字符串的。英文Regular Express

1.什么是正则表达式

正则表达式是一种被用于从文本中检索符合某些特定模式的文本。

正则表达式是从左到右来匹配一个字符串的。英文Regular Expression,我们通常使用它的缩写 “regex” 或者 “regexp”。 正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。

2.为什么要学习正则表达式

正则表达式在我们开发过程中很常用,但是很多人并不会写正则表达式,每到要用正则表达式的时候怎么办呢?万能解决办法百度。真是一个好办法。万一百度没有自己想要的答案怎么办呢?那只能自己边学边写。这篇文章将可以帮助你边学边写正则表达式----文尾附常用正则表达式。

3.元字符

元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符写在方括号内的时候有特殊含义。 元字符如下:

元字符描述
.匹配除换行符以外的任意字符
[]字符类,匹配方括号中包含的任意字符。
[^]否定字符类。匹配方括号中不包含的任意字符。
*匹配前面的子表达式零次或多次
+匹配前面子表达式一次或多次
?匹配前面的子表达式零次或一次。
{n,m}花括号,匹配前面字符至少n次,但是不超过m次
(x,y,z)按照确切的顺序匹配字符xyz
|分支结构,匹配分支结构其中一个字符
\转义符,它可以还原元字符原来的含义,允许你匹配保留字符 `[ ] ( ) { } . * + ? ^ $ \
^匹配行的开始
$匹配行的结束

3.0.举例和测试方法

例如正则表达式[H|g]ello可以匹配字符串Hellohello。那么我们写完正则表达式后该怎么测试呢?

我们可以使用在线的正则表达式测试平台进行测试;例如菜鸟在线测试

image-20201206141825476

我们也可以使用对应的编程语言进行测试。

JavaScript

// 需要匹配的字符
var str = 'Hello'
// replace 里参数是正则表达式
var s = str.replace('[H|h]ello');
console.log(s)

Java

 public static void main(String[] args) {
        // 要验证的字符串
        String str = "hello";
        // 验证规则
        String regEx = "[H|h]ello";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        // 字符串是否与正则表达式相匹配
        boolean rs = matcher.matches();
        System.out.println(rs);
    }

Golang

package main

import (
	"fmt"
	"regexp"
)

func main() {
	str := "hello"
	matched, _ := regexp.MatchString("[H|h]ello", str)
	fmt.Println(matched)
}

Python

import re
pattern = re.compile(u'[H|h]ello')
str = u'hello'
print(pattern.search(str))

1.英文句号

英文句号.是元字符的最简单的例子。元字符 . 可以匹配任意单个字符。它不会匹配换行符和新行的字符。

例如正则表达式

.ar

它可以匹配par、6ar、zar等。

3.2.字符集

字符集也称为字符类。方括号被用于匹配字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。 例如正则表达式

[tTs]he

可以匹配字符the、The、she。

注意:方括号里的.表示它的字面意思。也就是说[.]ar只能匹配.ar字符,不能匹配par、6ar、zar等字符。

3.3.否定字符集

一般来说插入字符 ^ 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式

[^tTs]he

表示只要不是以t、T、s开头的以he结尾的字符都能被它匹配。

3.4.重复

元字符 +*? 可以用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。

星号

符号 * 表示匹配上一个匹配规则的零次或多次。如果出现在字符集或者字符类之后,它表示整个字符集的重复。

例如正则表达式

[a-z]*

它可以匹配一行中任意数量的小写字母。

*也可以和.一起使用,例如.*,用来匹配任意字符串。

加号

符号 + 匹配上一个字符的一次或多次。例如正则表达式

a+t

可以匹配aat、aaat…等字符。

问号

元字符 ? 用来表示前一个字符是可选的。该符号匹配前一个字符的零次或一次。例如正则表达式

[Tts]?he

可以匹配字符he、the、The、she。

3.5.花括号

在正则表达式中花括号用于指定字符或一组字符可以重复的次数。例如正则表达式

[0-9]{2,5}

表示数字0~9可以至少重复2次最多重复5次。

也可以写为

[0,9]{2,}

表示数字0~9至少重复2次

或者

[0.9]{5}

表示0~9最多重复5次

3.6.分支结构

元字符|用来定义分支结构,分支结构就像多个表达式之间的条件(switch)。例如正则表达式

[Tts]he

经过测试之后你可能认为分支结构跟字符集没有区别,但事实不是这样的。字符集合分支结构最大的区别是字符集只在字符级别上起作用,但分支结构在表达式级别任然有作用。例如正则表达式

[Tts]he|car

它可以匹配The、the、she或者car这两类。

3.7.转移特殊字符

正则表达式中使用反斜杠 \ 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 { } [ ] / \ + * . $ ^ | ?。在特殊字符前面加 \,就可以使用它来做匹配字符。 例如正则表达式

(c|m)at\.

可以匹配mat.cat.

3.8.定位符

在正则表达式中,为了检查匹配符号是起始符号或结尾符号,可以使用定位符^检查字符是否是起始字符,使用$检查匹配字符是否是字符最后一个字符。

起始定位符

插入符号 ^ 符号用于检查匹配字符是否是输入字符串的第一个字符。例如正则表达式

^[Tt]he

它可以匹配所有以theThe开始的所有字符。

结尾定位符

美元符号$可以检查一组字符是否以某个子字符结尾。例如正则表达式

end$

它可以匹配所有以end结尾的字符。

4.简写字符集

正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:

简写描述
.匹配出换行符以外的任意字符
\w匹配所有字母和数字的字符:[a-zA-Z0-9_]
\W匹配非字母和数字的字符: [^\w]
\d匹配数字: [0-9]
\D匹配非数字: [^\d]
\s匹配空格符: [\t\n\f\r\p{Z}]
\S匹配非空格符: [^\s]

5.标记

标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。

标记描述
i不区分大小写: 将匹配设置为不区分大小写。
g全局搜索: 搜索字符串中的所有匹配。
m多行匹配: 会匹配输入字符串每一行。

标记在正则表达式中的用法如下

正则表达式/标记符

注意:在线测试标识符在选项中,自己选择而不用写出来。

image-20201206201629399

对字符不区分大小写且全局搜索

\w\gi

对字符全局搜索多行匹配

\w\gm

6.断言

断言即满足某个条件,断言有些地方又叫零宽断言,它用于(不)匹配某些字符前面或者后面的字符。断言有以下几种:

符号描述
(?=exp)正向先行断言:正则用于匹配?=前面的内容满足?=后面是exp
(?<=exp)正向后行断言:正则用于匹配exp后面满足某个条件的内容
(?!exp)负向正行断言:正则用于匹配exp后面不满足某个条件的内容
(?<!exp)负向后行断言:正则用于匹配exp后面不满足某个条件的内容

正向先行断言

正向先行断言用于找到某个内容后用正则去匹配它前面的内容。例如正则表达式

(H|h)(?=ello)

它用于找到ello后,如果前面是h或者H,则返回Hh

正向后行断言

后向先行断言用于找到某个内容后用正则去匹配它后面的内容。例如正则表达式

(?<=[h|H])ello

它用于找到H或者h后,去匹配后面内容是不是ello,如果是返回ello

负向先行断言

(H|h)(?!ello)

找到Hh后后面不是ello,返回Hh

负向后行断言

(?<!(H|h))ello

找到ello后,如果前面不是Hh,返回ello


7.常用正则表达式

7.1.邮箱

pikachues-001@gmail.com 只允许英文字母、数字、下划线、英文句号、以及中划线组成

^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

7.2.手机号

13012345678 手机号

	^1(3|4|5|6|7|8|9)\d{9}$

7.3.域名

https://google.com/

^((http:\/\/)|(https:\/\/))?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}(\/)

7.4.ip

127.0.0.1

((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

7.5.帐号校验

pikachues_001 字母开头,允许5-16字节,允许字母数字下划线

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

7.6.字符校验

汉字

^[\u4e00-\u9fa5]{0,}$

英文和数字

由数字和26个英文字母组成的字符串

^[A-Za-z0-9]+$

由26个英文字母组成的字符串

^[A-Za-z]+$

由26个大写英文字母组成的字符串

^[A-Z]+$

由26个小写英文字母组成的字符串

^[a-z]+$

长度为3-20的所有字符

^.{3,20}$

中文、英文、数字包括下划线

^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字但不包括下划线等符号

^[\u4E00-\u9FA5A-Za-z0-9]+$

7.7.数字校验

整数

^-?[1-9]\d*$

正整数

^[1-9]\d*$

负整数

^-[1-9]\d*$

非负整数

^[1-9]\d*|0$

非正整数

^-[1-9]\d*|0$

浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

正浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

负浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$

非负浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

8.更多扩展

扩展书籍