|
常用正则表达式模式
模式 描述 示例
^ 字符串开始 ^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>
|
|
|
|
|
|
|
|