正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些示例模式,以帮助您入门。
这是开始使用正则表达式(Regex)的快速备忘单。
| 范例 | 说明 |
|---|---|
. | 任何单个字符 |
\s | 任何空白字符 |
\S | 任何非空白字符 |
\d | 任何数字,与 [0-9] 相同 |
\D | 任何非数字,与 [^0-9] 相同 |
\w | 任何单词字符 |
\W | 任何非单词字符 |
\X | 任何 Unicode 序列,包括换行符 |
\C | 匹配一个数据单元 |
\R | Unicode 换行符 |
\v | 垂直空白字符 |
\V | \v 的否定 - 除了换行符和垂直制表符之外的任何内容 |
\h | 水平空白字符 |
\H | \h 的否定 |
\K | 重置匹配 |
\n | 匹配第 n 个子模式 |
\pX | Unicode 属性 X |
\p{...} | Unicode 属性或脚本类别 |
\PX | \pX 的否定 |
\P{...} | \p 的否定 |
\Q...\E | 引用;视为文字 |
\k<name> | 匹配子模式name |
\k'name' | 匹配子模式name |
\k{name} | 匹配子模式name |
\gn | 匹配第 n 个子模式 |
\g{n} | 匹配第 n 个子模式 |
\g<n> | 递归第 n 个捕获组 |
\g'n' | 递归第 n 个捕获组。 |
\g{-n} | 匹配第 n 个相对前一个子模式 |
\g<+n> | 递归第 n 个相对即将到来的子模式 |
\g'+n' | 匹配第 n 个相对即将到来的子模式 |
\g'letter' | 递归命名捕获组 字母 |
\g{letter} | 匹配先前命名的捕获组 字母 |
\g<letter> | 递归命名捕获组 字母 |
\xYY | 十六进制字符 YY |
\x{YYYY} | 十六进制字符 YYYY |
\ddd | 八进制字符ddd |
\cY | 控制字符 Y |
[\b] | 退格字符 |
\ | 使任何字符文字 |
| 字符类 | 如同 | 意义 |
|---|---|---|
[[:alnum:]] | [0-9A-Za-z] | 字母和数字 |
[[:alpha:]] | [A-Za-z] | 字母 |
[[:ascii:]] | [\x00-\x7F] | ASCII 码 0-127 |
[[:blank:]] | [\t ] | 仅空格或制表符 |
[[:cntrl:]] | [\x00-\x1F\x7F] | 控制字符 |
[[:digit:]] | [0-9] | 十进制数字 |
[[:graph:]] | [[:alnum:][:punct:]] | 可见字符(不是空格) |
[[:lower:]] | [a-z] | 小写字母 |
[[:print:]] | [ -~] == [ [:graph:]] | 可见字符 |
[[:punct:]] | [!"#$%&’()*+,-./:;<=>?@[]^_`{|}~] | 可见标点符号 |
[[:space:]] | [\t\n\v\f\r ] | 空白 |
[[:upper:]] | [A-Z] | 大写字母 |
[[:word:]] | [0-9A-Za-z_] | 单词字符 |
[[:xdigit:]] | [0-9A-Fa-f] | 十六进制数字 |
[[:<:]] | [\b(?=\w)] | 词的开头 |
[[:>:]] | [\b(?<=\w)] | 词尾 |
| :- | - |
|---|---|
(*ACCEPT) | 控制动词 |
(*FAIL) | 控制动词 |
(*MARK:NAME) | 控制动词 |
(*COMMIT) | 控制动词 |
(*PRUNE) | 控制动词 |
(*SKIP) | 控制动词 |
(*THEN) | 控制动词 |
(*UTF) | 图案修饰符 |
(*UTF8) | 图案修饰符 |
(*UTF16) | 图案修饰符 |
(*UTF32) | 图案修饰符 |
(*UCP) | 图案修饰符 |
(*CR) | 换行修饰符 |
(*LF) | 换行修饰符 |
(*CRLF) | 换行修饰符 |
(*ANYCRLF) | 换行修饰符 |
(*ANY) | 换行修饰符 |
\R | 换行修饰符 |
(*BSR_ANYCRLF) | 换行修饰符 |
(*BSR_UNICODE) | 换行修饰符 |
(*LIMIT_MATCH=x) | 正则表达式引擎修饰符 |
(*LIMIT_RECURSION=d) | 正则表达式引擎修饰符 |
(*NO_AUTO_POSSESS) | 正则表达式引擎修饰符 |
(*NO_START_OPT) | 正则表达式引擎修饰符 |
* 号| 表达式 | 匹配示例 |
|---|---|
[a-z]* | The carparked inthe garage |
\s*cat\s* | The fat cat sat on the concatenation. |
表达式 [a-z]* 匹配一个行中所有以小写字母开头的字符串。
+ 号| 表达式 | 匹配示例 |
|---|---|
c.+t | The fat cat sat on the mat. |
表达式 c.+t 匹配以首字母c开头以t结尾,中间跟着至少一个字符的字符串。
? 号| 表达式 | 匹配示例 |
|---|---|
[T]he | The car is parked in the garage. |
[T]?he | The car is parked in the garage. |
表达式 [T]?he 匹配字符串 he 和 The。
>>> sentence = 'This is a sample string'
>>> bool(re.search(r'this', sentence, flags=re.I))
True
>>> bool(re.search(r'xyz', sentence))
False
>>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
['par', 'spar', 'spare', 'pare']
>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
['0501', '154', '98234']
>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
>>> [m[0] for m in m_iter if int(m[0]) < 350]
['45', '349', '4', '204']
>>> re.split(r'\d+', 'Sample123string42with777numbers')
['Sample', 'string', 'with', 'numbers']
>>> ip_lines = "catapults\nconcatenate\ncat"
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
* catapults
* concatenate
* cat
>>> pet = re.compile(r'dog')
>>> type(pet)
<class '_sre.SRE_Pattern'>
>>> bool(pet.search('They bought a dog'))
True
>>> bool(pet.search('A cat crossed their path'))
False
| :- | :- |
|---|---|
dotAll | 是否使用了 s 修饰符 |
flags | 返回标志的字符串 |
global | 是否使用了 g (全部)修饰符 |
hasIndices | 是否使用了 d 修饰符 |
ignoreCase | 匹配文本的时候是否忽略大小写 i |
multiline | 是否进行多行搜索 m |
lastIndex | 该索引表示从哪里开始下一个匹配 |
source | 正则表达式的文本 |
sticky | 搜索是否是 sticky |
unicode | Unicode 功能是否开启 |
| :- | :- |
|---|---|
match() | 获取匹配结果 |
matchAll() | 所有匹配项 |
replace() | 替换所有符合正则模式的匹配项 |
search() | 搜索以取得匹配正则模式的项 |
split() | 切割字符串返回字符串数组 |
compile() | (重新)编译正则表达式 |
exec() | 指定字符串中执行一个搜索匹配 |
test() | 正则表达式与指定的字符串是否匹配 |
toString() | 返回该正则表达式的字符串 |
$regex = "/[a-zA-Z]+ (\d+)/";
$input_str = "June 24, August 13, and December 30";
if (preg_match_all($regex, $input_str, $matches_out)) {
// Output: 2
echo count($matches_out);
// Output: 3
echo count($matches_out[0]);
// Output: Array("June 24", "August 13", "December 30")
print_r($matches_out[0]);
// Output: Array("24", "13", "30")
print_r($matches_out[1]);
}
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 = "[A-Z\n]{5}$";
String str = "I like APP\nLE";
Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);
// Outputs: I like Apple!
System.out.println(m.replaceAll("pple!"));
所有匹配的数组:
String str = "She sells seashells by the Seashore";
String regex = "\\w*se\\w*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
List<String> matches = new ArrayList<>();
while (m.find()) {
matches.add(m.group());
}
// Outputs: [sells, seashells, Seashore]
System.out.println(matches);