一、正则表达式基础语法(Regular Expression)
1、正则表达式的创建方式
伪代码JavaScript
var reg = new RegExp("正则表达式","igm");
var reg = /正则表达式/igm;
伪代码Java
// 给regex正则表达式、给input要匹配的内容
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
// Pattern p = Pattern.compile("正则表达式");
Matcher m = p.matcher(input);
// Matcher m = p.matcher(“被检验的字符串”);
伪代码python
import re
# 给regExp正则表达式、给string1要匹配的内容
pattern = re.compile(regExp, re.I)
match = pattern.match(string1)
2、分组()和分隔|
(1)| 用于分割可供选择的字符,要与 ( ) 搭配使用,存在优先匹配:从左到右(从繁到简)。注意与 [ ] 搭配,就是他本身 |,不代表分割。
如 [ab|cd],既可以匹配 ab 也可以匹配 cd。
选择项的尝试匹配次序是左——>右,因此,[a | ab]中当a匹配之后,就不匹配 ab 了,即使 ab 更优。所以书写顺序应该是从繁到简。
(2)() 分组,作用1:把一部分作为整体;作用2:定义子模式方便后面引用
作为整体,加上重复次数,如
java(script)?
可以匹配java和javascript
定义子模式,方便后面通过\加数字引用,例如
regExp = "['][a-z][']"
regExp = "(['])[a-z]\1"
效果相同
3、\转译^$.*+?=|!/:{}()[] 、字符类、重复次数、位置锚点、修饰符
(1)特殊字符,^$.*+?=|!/:{}()[] 需要\转译
\o \t \n \v \f \r
^$.*+?=|!/:{}()[] 需要\转译
(2)字符类,[\w\W\s\S\d\D]
JavaScript | Java | Python | 意义 |
---|---|---|---|
[...] | [...] | [...] | 方括号内的任意字符 |
[^...] | [^...] | [^...] | 不在方括号内的任意字符 |
[a-b] | [a-b] | [a-b] | 字符范围。匹配包含的任一字符集 |
[^a-b] | [^a-b] | [^a-b] | 反向范围字符。匹配不在指定范围内的任何字符 |
. | . | . | 任意字符 |
\w | \\w | \w | 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\W | \\W | \W | 任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\s | \\s | \s | 任何Unicode空白符 |
\S | \\S | \S | 任何非Unicode空白符的字符,注意\w和\S不一样 |
\d | \\d | \d | 任何ASCII数值,等价于[0-9] |
\D | \\D | \D | 任何ASCII数字之外的任何字符,等价于[^0-9] |
\数字 | \\数字 | \\数字 | 数字需要是正整数,到捕获匹配的反向引用 |
[\b] | 退格直接量(特例) |
(3)重复次数,?+*{n}{n,}{m,n}
JavaScript | Java | Python | 意义 |
---|---|---|---|
? | ? | ? | 0或1次 |
+ | + | + | 1次或多次 |
* | * | * | 任意次 |
{n} | {n} | {n} | n次 |
{n,} | {n,} | {n,} | n次或n次以上 |
{m,n} | {m,n} | {m,n} | 最少m次,最多n次 |
正则是贪婪的,在全体满足匹配条件的情况下,尽可能贪婪。
(4)位置锚点,^$\b\B(?=p)(?!p)
JavaScript | Java | Python | 意义 |
---|---|---|---|
^ | ^ | ^ | 匹配字符串的开头,在多行检测中,匹配一行的开头 |
$ | $ | $ | 匹配字符串的结尾,在多行检测中,匹配一行的结尾 |
\b | \\b | \\b | 匹配一个单词边界的位置 |
\B | \\B | \\B | 匹配非单词边界的位置 |
(?=p) | (?=p) | (?=p) | 零宽正向先行断言(要求接下来的字符都与p匹配,但不能包含匹配p的那些字符) |
(?!p) | (?!p) | (?!p) | 零宽负向先行断言(要求接下来的字符不与p匹配) |
(5)修饰符,re.I、re.L、re.M、re.S、re.U、re.X
JavaScript | Java | Python | 意义 |
---|---|---|---|
i | Pattern.CASE_INSENSITIVE | re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 | ||
m | re.M | 多行匹配,影响 ^ 和 $ | |
Pattern.DOTALL | re.S | 使 . 匹配包括换行在内的所有字符 | |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. | ||
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 | ||
g | 执行一个全局匹配,简而言之,即找到所有的匹配,而不是在找到第一个之后就停止 | ||
Pattern.UNICODE_CASE | 根据Unicode字符集使匹配对大小写不敏感 |
二、函数和方法
Python:re模块的match()、search()、findall()和sub()、split()
详见
https://blog.csdn.net/weixin_43473435/article/details/83830707
Java:lookingAt()、matches()、find()
详见
https://blog.csdn.net/weixin_43473435/article/details/83793500
JavaScript:reg.test()、reg.exec()、str.search()和str.replace()
详见
https://blog.csdn.net/weixin_43473435/article/details/83756259