常用正则表达式模式 模式 描述 示例 ^ 字符串开始 ^A 匹配以 A 开头的字符串 $ 字符串结束 z$ 匹配以 z 结尾的字符串 . 任意单个字符 a.c 匹配 aac, abc 等 * 0 次或多次 ab*c 匹配 ac, abc, abbc 等 + 1 次或多次 ab+c 匹配 abc, abbc 等 ? 0 次或 1 次 ab?c 匹配 ac 或 abc {n} 恰好 n 次 a{3} 匹配 aaa {n,} 至少 n 次 a{2,} 匹配 aa, aaa 等 [ ] 字符集 [abc] 匹配 a 或 b 或 c \d 数字 等价于[0-9] \w 单词字符 等价于[A-Za-z0-9_] \s 空白字符 包括空格、制表符等 --------------------------------------------------------------------------------- |
字符类:[] 用于定义字符集。 量词:*, +, ?, {n}, {n,m} 用于指定匹配次数。 锚点:^ 和 $ 用于匹配字符串的开头和结尾。 分组:() 用于捕获匹配的部分。 替换:结合正则表达式,可以轻松替换字符串中的模式。 |
## 常用正则表达式模式 以下是一些常见的正则表达式模式及其用途: ### 字符类 - **`.`**:匹配除换行符 `\n` 之外的任意单个字符。例如,在字符串 `"abc123"` 中,正则表达式 `.` 可以匹配到 `"a"`、`"b"`、`"c"`、`"1"`、`"2"`、`"3"` 中的任意一个字符。 - **`\w`**:匹配字母、数字和下划线。等价于 `[a-zA-Z0-9_]`。例如,在字符串 `"hello_world123"` 中,`\w` 可以匹配到 `"h"`、`"e"`、`"l"`、`"o"`、`"w"`、`"r"`、`"l"`、`"d"`、`"1"`、`"2"`、`"3"`。 - **`\W`**:匹配非字母、非数字和非下划线的字符。等价于 `[^a-zA-Z0-9_]`。例如,在字符串 `"hello@world!"` 中,`\W` 可以匹配到 `"@"` 和 `"!"`。 - **`\s`**:匹配任意空白字符,包括空格、制表符 `\t`、换行符 `\n` 等。例如,在字符串 `"hello world"` 中,`\s` 可以匹配到两个单词之间的空格。 - **`\S`**:匹配非空白字符。等价于 `[^ \t\n\r\f\v]`,即匹配除空白字符之外的任意字符。例如,在字符串 `"hello world"` 中,`\S` 可以匹配到 `"hello"` 和 `"world"` 中的所有字符,但不能匹配到它们之间的空格。 - **`\d`**:匹配任意数字,等价于 `[0-9]`。例如,在字符串 `"abc123"` 中,`\d` 可以匹配到 `"1"`、`"2"`、`"3"`。 - **`\D`**:匹配非数字字符,等价于 `[^0-9]`。例如,在字符串 `"abc123"` 中,`\D` 可以匹配到 `"a"`、`"b"`、`"c"`。 ### 边界匹配 - **`^`**:匹配输入字符串的开始位置。例如,正则表达式 `^a` 只能匹配以字母 `"a"` 开头的字符串,如 `"apple"` 可以匹配,而 `"banana"` 不能匹配。 - **`$`**:匹配输入字符串的结束位置。例如,正则表达式 `s$` 只能匹配以字母 `"s"` 结尾的字符串,如 `"class"` 可以匹配,而 `"student"` 不能匹配。 - **`\b`**:匹配一个单词边界,即单词和空格之间的位置。例如,正则表达式 `\bcat\b` 可以匹配 `"cat"`,但不能匹配 `"catalog"` 中的 `"cat"`。 - **`\B`**:匹配非单词边界。例如,正则表达式 `\Bcat\B` 可以匹配 `"catalog"` 中的 `"cat"`,但不能匹配单独的 `"cat"`。 ### 量词 - **`*`**:匹配前面的元素零次或多次。例如,正则表达式 `a*` 可以匹配 `"a"`、`"aa"`、`"aaa"`……,也可以匹配空字符串(即零次匹配)。 - **`+`**:匹配前面的元素一次或多次。例如,正则表达式 `a+` 可以匹配 `"a"`、`"aa"`、`"aaa"`……,但不能匹配空字符串。 - **`?`**:匹配前面的元素零次或一次。例如,正则表达式 `a?` 可以匹配 `"a"` 或空字符串。 - **`{n}`**:匹配前面的元素恰好 `n` 次。例如,正则表达式 `a{3}` 只能匹配 `"aaa"`。 - **`{n,}`**:匹配前面的元素至少 `n` 次。例如,正则表达式 `a{3,}` 可以匹配 `"aaa"`、`"aaaa"`……,但不能匹配少于 3 个 `"a"` 的字符串。 - **`{n,m}`**:匹配前面的元素至少 `n` 次,但不超过 `m` 次。例如,正则表达式 `a{2,4}` 可以匹配 `"aa"`、`"aaa"`、`"aaaa"`,但不能匹配少于 2 个 `"a"` 或多于 4 个 `"a"` 的字符串。 ### 分组与捕获 - **`()`**:用于分组和捕获。例如,正则表达式 `(ab)+` 可以匹配 `"ab"`、`"abab"`、`"ababab"`……,并且捕获每个匹配的 `"ab"` 作为一个分组。 - **`(?:...)`**:非捕获分组,用于分组但不捕获匹配的内容。例如,正则表达式 `(?:ab)+` 可以匹配 `"ab"`、`"abab"`……,但不会捕获匹配的 `"ab"`。 - **`|`**:表示逻辑“或”。例如,正则表达式 `a|b` 可以匹配 `"a"` 或 `"b"`。 ## `\S` 的含义 `\S` 是一个正则表达式元字符,它表示匹配任意非空白字符。等价于 `[^ \t\n\r\f\v]`,即匹配除空白字符(包括空格、制表符 `\t`、换行符 `\n`、回车符 `\r`、垂直制表符 `\v`、换页符 `\f` 等)之外的任意字符。例如,在字符串 `"hello world"` 中,`\S` 可以匹配到 `"hello"` 和 `"world"` 中的所有字符,但不能匹配到它们之间的空格。 |
正则表达式(Regular Expression,简称regex或regexp)是一种用来匹配字符串的强大工具。它广泛应用于文本搜索和文本替换等操作中。以下是几种常用的正则表达式模式: 1. **`.`** - 匹配除换行符之外的任何单个字符。 2. **`^`** - 匹配输入字符串的开始位置。如果设置了多行模式,还会匹配每行的开始位置。 3. **`$`** - 匹配输入字符串的结束位置。如果设置了多行模式,还会匹配每行的结束位置。 4. **`*`** - 匹配前面的子表达式零次或多次。 5. **`+`** - 匹配前面的子表达式一次或多次。 6. **`?`** - 匹配前面的子表达式零次或一次。 7. **`{n}`** - 匹配确定的 `n` 次由前面的正则表达式定义的片段。 8. **`{n,}`** - 匹配至少 `n` 次由前面的正则表达式定义的片段。 9. **`{n,m}`** - 匹配至少 `n` 次,至多 `m` 次由前面的正则表达式定义的片段。 10. **`[xyz]`** - 字符集,匹配括号内的任意一个字符。 11. **`[^xyz]`** - 反向字符集,匹配不在括号内的任意一个字符。 12. **`\d`** - 匹配一个数字字符,等价于 `[0-9]`。 13. **`\D`** - 匹配一个非数字字符,等价于 `[^0-9]`。 14. **`\s`** - 匹配任何空白字符,包括空格、制表符、换页符等。 15. **`\S`** - 匹配任何非空白字符,与 `\s` 相反。因此,`\S` 代表的是所有不是空白字符的字符,例如字母、数字、标点符号等。 16. **`\w`** - 匹配包括下划线的任何单词字符。等价于 `[A-Za-z0-9_]`。 17. **`\W`** - 匹配任何非单词字符。等价于 `[^A-Za-z0-9_]`。 这些只是基础的正则表达式模式的一部分,实际上还有更多复杂的用法和模式可用于特定的需求。理解每个符号的作用可以帮助你更高效地编写和使用正则表达式。 |
|
查找字符串中所有的 "cat"。 cat 输入:"The cat is on the mat." 匹配:"cat" |
查找字符串中所有的单个字符(不关心具体是什么字符)。 . 输入:"abc" 匹配:"a", "b", "c" SELECT REGEXP_COUNT('123','.') FROM dual; 3 |
查找字符串中所有的元音字母 - []表示集合,无顺序之分 [aeiou] 输入:"Hello World" 匹配:"e", "o", "o" 集合中字符无顺序之分,下面两个语句的结果一致 SELECT REGEXP_REPLACE('Oracle Oops!', '[aops]', '0', 1, 0, 'i') AS RESULT FROM dual; SELECT REGEXP_REPLACE('Oracle Oops!', '[opas]', '0', 1, 0, 'i') AS RESULT FROM dual; 0r0cle 0000! |
查找字符串中所有的小写字母 [a-z] 输入:"Hello123" 匹配:"e", "l", "l", "o" ---------------------------------------------------------------- |
匹配重复字符 查找字符串中所有的连续数字 \d+ \d 匹配任意数字(0-9) + 表示匹配前面的模式一次或多次 SELECT REGEXP_SUBSTR ('20230515', '\d{4}\d{2}\d{2}') as formatted_date FROM dual; 20230515 SELECT REGEXP_SUBSTR ('20230515', '(\d{4})(\d{2})(\d{2})') as formatted_date FROM dual; 20230515 |
查找字符串中可能存在的 "s" 或 ""(即 s 可有可无)。 s? 输入:"cats", "cat" 匹配:"s"(在 "cats" 中), ""(在 "cat" 中) |
|
查找以 "." 结尾的字符串 \.$ \. 匹配字面上的点号(. 是正则中的特殊字符,需转义) $ 表示字符串结尾 输入:"This is a sentence." 匹配:"." |
提取日期 从字符串中提取日期(格式:YYYY-MM-DD) (\d{4})-(\d{2})-(\d{2}) \d{4} 匹配 4 位数字(年份) \d{2} 匹配 2 位数字(月份和日期) () 用于分组,捕获匹配的部分 输入:"The event is on 2023-10-15." 捕获组:"2023", "10", "15" |
将字符串中的所有空格替换为下划线 查找:\s+ 替换为:_ \s+ 匹配一个或多个空白字符 输入:"Hello World" 输出:"Hello_World" |
验证电子邮件地址 检查字符串是否为有效的电子邮件地址 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ^ 和 $ 确保整个字符串匹配 [a-zA-Z0-9._%+-]+ 匹配用户名部分 @ 匹配 @ 符号 [a-zA-Z0-9.-]+ 匹配域名部分 \.[a-zA-Z]{2,} 匹配顶级域名(如 .com, .org) 输入:"user@example.com" 匹配:"user@example.com" |
|
查找字符串中第一个 "tag" 标签对中的内容 <tag>.*?</tag> .*? 是非贪婪匹配,匹配尽可能少的字符。 输入:"<tag>First</tag><tag>Second</tag>" 匹配:"<tag>First</tag>" SELECT REGEXP_SUBSTR ('<tag>First</tag><tag>Second</tag>', '<tag>.*</tag>') as formatted_date FROM dual; <tag>First</tag><tag>Second</tag> SELECT REGEXP_SUBSTR ('<tag>First</tag><tag>Second</tag>', '<tag>.*?</tag>') as formatted_date FROM dual; <tag>First</tag> |
|
|
|
|