- 速查手册: regexlearn.com
- 在线测试: regex101.com
- 常见用法: common-regex
基础语法备忘
非贪婪模式
在量词后添加?
, 例如{m,n}?
或+?
组相关
- 组:
(balabala)
- 引用组:
\1
,\2
- 非捕获组:
(?:balabala)
多匹配
- 方括号
[]
: 字面层面的同时匹配 - 竖线
|
:表达式层面的同时匹配
特殊字符
\w
: 字母、数字和下划线\W
: 匹配除字母、数字和下划线之外的字符\d
: 仅用来匹配数字\D
: 匹配除数字之外的字符\s
: 仅匹配空白字符\S
: 匹配除空白符之外的字符
零宽断言
- 正向先行断言
(?=)
:\d+(?=PM)
, 匹配后面有PM
的数值 - 负向先行断言
(?!)
- 正向后行断言
(?<=)
- 负向后行断言
(?<!)
标记位(模式)
标志位决定表达式是否将文本视作单独的行处理,是否区分大小写,或者是否查找所有匹配项。
- 全局标记
g
: 如果不启用全局标志,表达式只会匹配第一个匹配项 - 多行标记
m
: 如果我们使用了多行标志,它就会单独处理每一行(默认视作一行) - 忽略大小写标记
i
实际运用
Python版本
参考文档
使用方法
需要先导入re
:
re.match
# 更改号码格式 match = re.match(r'^(\d{3})\-(\d{4})-(\d{4})$', '010-1234-5678') result = "".join(match.groups()) print(result) # -------------------- # 01012345678
re.search
pattern = r"hello" text = "hello world" match_search = re.search(pattern, text)
re.compile
,re.findall
re_telephone = re.compile(r'[a-z]{3}',re.M|re.I) re_telephone.findall('abc\naDd') # -------------------- # ['abc', 'aDd']
re.split
# 空格分割 re.split(r'\s+', 'a b c') # -------------------- # ['a', 'b', 'c']
re.sub
re.sub(r'(?<=password: )(\w{6,8})','******', 'password: 1234asdw') # -------------------- # 'password: ******'
JavaScript版本
参考文档
使用方法
可以结合RegExp
使用: 【需要转义】
let re = new RegExp("\\d+");
test
: 检索字符串中是否存在匹配的模式。它返回 true 或 false。【相当于Python中的match
】let re = /ab+c/; let str = "ac abc abbbc abbbbbc"; let result = re.test(str); // true
match
: 检索字符串中的所有匹配。它返回一个数组,其中存储了与正则表达式相匹配的所有字符串。【相当于Python中的findall
】let re = /ab+c/g; let str = "ac abc abbbc abbbbbc"; let result = str.match(re); // ["abc", "abbbc", "abbbbbc"]
search
: 检索与正则表达式相匹配的值。它返回第一个匹配的起始位置。【相当于Python中的search
】let re = /ab+c/; let str = "ac abc abbbc abbbbbc"; let result = str.search(re); // 2
replace
: 检索与正则表达式相匹配的值,并替换成指定的值。它返回被替换后的字符串。let re = /ab+c/g; let str = "ac abc abbbc abbbbbc"; let result = str.replace(re, "X"); // "ac X X X"
Java版本
参考文档
使用方法
调用方法:
// 第一种
Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");
boolean s1 = m.matches();
System.out.println(s1); // Outputs: true
// 第二种
boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2); // Outputs: true
// 第三种
boolean s3 = Pattern.matches(".s", "XXXX");
System.out.println(s3); // Outputs: false
// 第四种
String regex = "20\\d\\d";
System.out.println("2019".matches(regex)); // true
matches
String input = "Hello, World!"; String regex = "Hello.*"; boolean isMatch = input.matches(regex); System.out.println(isMatch); // 输出:true
find
// 实现findAll String input = "The quick brown fox jumps over the lazy dog."; String regex = "\\b(\\w{5})\\b"; // 匹配长度为5的单词 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { String match = matcher.group(); // 等价于matcher.group(0) System.out.println(match); System.out.println(matcher.group(1)); }
split
String input = "One,Two,Three,Four,Five"; String regex = ","; // 以逗号为分隔符 String[] parts = input.split(regex); System.out.println(Arrays.toString(parts));
replaceAll
【注意,replace
不支持regex】String input = "Hello, World!"; String regex = "o"; String replacement = "*"; String replacedString = input.replaceAll(regex, replacement); System.out.println(replacedString); // 输出:Hell*, W*rld!