共计 4389 个字符,预计需要花费 11 分钟才能阅读完成。
1. 什么是正则表达式
正则表达式是一种被用于从文本中检索合乎某些特定模式的文本。
正则表达式是从左到右来匹配一个字符串的。英文Regular Expression,咱们通常应用它的缩写 “regex” 或者 “regexp”。正则表达式能够被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。
2. 为什么要学习正则表达式
正则表达式在咱们开发过程中很罕用,然而很多人并不会写正则表达式,每到要用正则表达式的时候怎么办呢?万能解决办法 百度。真是一个好方法。万一百度没有本人想要的答案怎么办呢?那只能本人边学边写。这篇文章将能够帮忙你边学边写正则表达式 —- 文尾附罕用正则表达式。
3. 元字符
元字符是正则表达式的根本组成元素。元字符在这里跟它通常表白的意思不一样,而是以某种非凡的含意去解释。有些元字符写在方括号内的时候有非凡含意。元字符如下:
元字符 | 形容 | |
---|---|---|
. | 匹配除换行符以外的任意字符 | |
[] | 字符类,匹配方括号中蕴含的任意字符。 | |
[^] | 否定字符类。匹配方括号中不蕴含的任意字符。 | |
* | 匹配后面的子表达式零次或屡次 | |
+ | 匹配后面子表达式一次或屡次 | |
? | 匹配后面的子表达式零次或一次。 | |
{n,m} | 花括号,匹配后面字符至多 n 次,然而不超过 m 次 | |
(x,y,z) | 依照确切的程序匹配字符 xyz | |
\ | 分支构造,匹配分支构造其中一个字符 | |
\ | 本义符,它能够还原元字符原来的含意,容许你匹配保留字符 `[] () {} . * + ? ^ $ \ | |
^ | 匹配行的开始 | |
$ | 匹配行的完结 |
3.0. 举例和测试方法
例如正则表达式 [H|g]ello
能够匹配字符串 Hello
或hello
。那么咱们写完正则表达式后该怎么测试呢?
咱们能够应用在线的正则表达式测试平台进行测试;例如菜鸟在线测试
咱们也能够应用对应的编程语言进行测试。
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
它能够匹配所有以 the
或The
开始的所有字符。
结尾定位符
美元符号 $
能够查看一组字符是否以某个子字符结尾。例如正则表达式
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 | 多行匹配: 会匹配输出字符串每一行。 |
标记在正则表达式中的用法如下
正则表达式 / 标记符
留神:在线测试标识符在选项中,本人抉择而不必写进去。
对字符不辨别大小写且全局搜寻
\w\gi
对字符全局搜寻多行匹配
\w\gm
6. 断言
断言即满足某个条件,断言有些中央又叫 零宽断言,它用于(不)匹配某些字符后面或者前面的字符。断言有以下几种:
符号 | 形容 |
---|---|
(?=exp) | 正向后行断言:正则用于匹配?= 后面的内容满足?= 前面是 exp |
(?<=exp) | 正向后行断言:正则用于匹配 exp 前面满足某个条件的内容 |
(?!exp) | 负向正行断言:正则用于匹配 exp 前面不满足某个条件的内容 |
(?<!exp) | 负向后行断言:正则用于匹配 exp 前面不满足某个条件的内容 |
正向后行断言
正向后行断言用于找到某个内容后用正则去匹配它后面的内容。例如正则表达式
(H|h)(?=ello)
它用于找到 ello
后,如果后面是 h
或者 H
,则返回H
或h
。
正向后行断言
后向后行断言用于找到某个内容后用正则去匹配它前面的内容。例如正则表达式
(?<=[h|H])ello
它用于找到 H
或者 h
后,去匹配前面内容是不是ello
, 如果是返回ello
负向后行断言
(H|h)(?!ello)
找到 H
或h
后前面不是 ello
, 返回H
或h
负向后行断言
(?<!(H|h))ello
找到 ello
后,如果后面不是 H
或h
,返回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. 更多扩大
扩大书籍