---
title: "正则表达式"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/regular-expressions/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/01-系统基础与网络安全/计算机与操作系统/正则表达式.md"
content_hash: 6b0d6b478ba6de1c2eae084318f234f2cf030e8a92be71b36db1f6f1499b4eac
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 正则表达式

> 创建时间：2020/8/31 12:20

  * 正则表达式
    * 概念
      * 应用
    * 语法
      * 普通字符
      * 非打印字符
      * 特殊字符
      * 限定符
      * 定位符
      * 选择、反向引用等操作
    * 修饰符（标记）
    * 元字符列表
    * 运算符优先级
    * 匹配规则
      * 字符簇
    * 应用示例
      * 匹配两个特殊字符中间的内容
    * CSRegular Expression的使用
    * Ref

## 概念

正则表达式(Regular Expression)是一种文本模式，包括普通字符（例如，a 到 z 之间的字母）和特殊字符（称为”元字符”）。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

> 工具：
>  <https://regex101.com/>
>  <http://c.runoob.com/front-end/854>

### 应用

  * 测试字符串内的模式。
例如，可以测试输入字符串，以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

  * 替换文本。
可以使用正则表达式来识别文档中的特定文本，完全删除该文本或者用其他文本替换它。

  * 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。

## 语法

‘+’ 号代表前面的字符必须至少出现一次（1次或多次）。
‘*’ 号代表前面的字符可以不出现，也可以出现一次或者多次（0次、或1次、或多次）。
‘?’ 问号代表前面的字符最多只可以出现一次（0次、或1次）。

### 普通字符

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 非打印字符

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 特殊字符

> 许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符，必须首先使字符”转义”，即，将反斜杠字符\ 放在它们前面。

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 限定符

指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

‘*’ 和 ‘+’ 限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

### 定位符

^
$
\b 匹配一个单词边界，即字与空格间的位置。
\B 非单词边界匹配。

### 选择、反向引用等操作

<https://www.runoob.com/regexp/regexp-syntax.html>

## 修饰符（标记）

正则表达式的标记用于指定额外的匹配策略。位于表达式之外。`/pattern/flags`
i ignore - 不区分大小写
g global - 全局匹配
m more - 多行匹配
s 特殊字符圆点 . 中包含换行符 \n

## 元字符列表

<https://www.runoob.com/regexp/regexp-metachar.html>

## 运算符优先级

\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列（即：位置和顺序）
|

> 字符具有高于替换运算符的优先级，使得”m|food”匹配”m”或”food”。若要匹配”mood”或”food”，请使用括号创建子表达式，从而产生”(m|f)ood”。

## 匹配规则

### 字符簇

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

## 应用示例

### 匹配两个特殊字符中间的内容

表达式: A.*?B（“.“表示任意字符，“？”表示匹配0个或多个）
示例: Abaidu.comB
结果: Awww.apizl.comB
匹配两个字符串A与B中间的字符串包含A但是不包含B：
表达式: A.*?(?=B)
示例: Awww.apizl.comB
结果: Awww.apizl.com
匹配两个字符串A与B中间的字符串且不包含A与B：
表达式: (?<=A).*?(?=B)
示例: Awww.baidu.comB
结果: www.baidu.com

> (?=pattern)：非获取匹配，正向肯定预查，在任何匹配pattern的字符串开始处匹配查找字符串，该匹配不需要获取供以后使用。例如，“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”，但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。
>
> (?<=pattern)：非获取匹配，反向肯定预查，与正向肯定预查类似，只是方向相反。例如，“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”，但不能匹配“3.1Windows”中的“Windows”。

## CSRegular Expression的使用

<https://www.runoob.com/csharp/csharp-regular-expressions.html>

## Ref

<https://www.runoob.com/regexp/regexp-intro.html>
<https://www.cnblogs.com/liaods/p/10049730.html>
