常用模型·总览

常用正则表达式模式

 
模式	  描述	  示例

^	字符串开始	  ^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" 中)

 


 

    
常用模式·详解·2

 
查找以 "." 结尾的字符串

\.$
    

 
\. 匹配字面上的点号(. 是正则中的特殊字符,需转义)
$ 表示字符串结尾

    

 
输入:"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>
    

 

    

 


 

  

 


参考