C# 正则表达式

正则表达式(**Reg**ular **Ex**pression)是一种用于检查给定字符串是否匹配该模式的模式。例如,

// a regex pattern
"^m.t$"

上面的模式表示一个三字母字符串,其中:

  • ^ - 表示字符串以 m 开头
  • . - 表示任意一个字母或字符
  • $ - 表示字符串以 t 结尾

例如,像 "mat""mit" 这样的字符串匹配上述正则表达式。但是,像 "mom""magnet" 这样的字符串不匹配,因为这些字符串不是以 m 开头并以 t 结尾的**3**个字母的单词。

我们将在下面详细学习正则表达式。


C# Regex 类

C# 提供了一个名为 Regex 的类来使用正则表达式的功能。在使用 Regex 类之前,我们需要使用 System.Text.RegularExpression 命名空间。

然后,我们需要创建一个 Regex 类的实例

Regex regexName = new Regex(pattern);

这里,

  • regexName - Regex 类实例的名称
  • pattern - 我们想传递的正则表达式模式

示例:C# Regex

using System;
using System.Text.RegularExpressions;
class Program { // a regular expression pattern for a five-letter word // that starts with "a" and ends with "e" static string pattern = "^a...e$"; static void Main() { // create an instance of Regex class and // pass the regular expression (i.e pattern) Regex rg = new Regex(pattern);
// IsMatch() returns true if "apple" matches the regular expression if (rg.IsMatch("apple")) { Console.WriteLine("String matches the pattern"); }
else { Console.WriteLine("String doesn't match the pattern"); } } }

输出

String matches the pattern

在上面的示例中,我们检查了字符串 "apple" 是否匹配定义的正则表达式。 "^a...e$" 模式表示任何以 a 开头并以 e 结尾的五个字母的字符串。

在这里,如果传递的字符串与正则表达式匹配,IsMatch() 方法将返回 True

如果我们传递另一个字符串,例如 "apache",它不匹配 pattern,因为 "apache"ae 之间有超过三个字母。

注意:我们将正则表达式指定为字符串。例如,

string pattern = "^a...e$";

正则表达式如何工作?

在 C# 中,有一个称为正则表达式引擎的引擎,它在内部检查给定字符串中的正则表达式。

regex engine is taking two inputs
正则表达式引擎的工作原理

在上图中,正则表达式引擎处理两个输入:

  • ^a…e$ - 正则表达式模式
  • "apple" - 我们想匹配的给定字符串

当正则表达式模式被传入引擎时,它会被解析。然后,引擎负责搜索操作,即使用户输入字符串匹配正则表达式模式。


元字符

为了指定正则表达式,使用了元字符。元字符是由正则表达式引擎以特殊方式解释的字符。

一些基本元字符是:

  • [] - 方括号
  • . - 点
  • ^ - 脱字符
  • $ - 美元符号
  • * - 星号
  • + - 加号
  • ? - 问号
  • {} - 花括号
  • () - 圆括号
  • | - 交替

[]- 方括号

[] 指定了您希望匹配的字符集。

例如,

  • 正则表达式 - [abc]
  • 匹配 - 包含 abc 的任何字符串。

让我们检查以下字符串示例是否与正则表达式 [abc] 匹配。

字符串 匹配? 原因
a 1 次匹配 字符串包含 a
ac 2 次匹配 字符串包含 ac
jim 0 次匹配 字符串不包含 abc
abc 3 次匹配 字符串包含所有三个 - abc

注意:您也可以使用方括号内的 - 来指定字符范围。例如,

  • [a-e] 等同于 [abcde]
  • [0-3] 等同于 [0123]

. - 点

点表示任何单个字符(换行符 '\n' 除外)。

例如,

  • 正则表达式 -
  • 匹配 - 包含三个字母的字符串

让我们检查以下字符串示例是否与正则表达式 匹配。

字符串 匹配? 原因
abs 1 次匹配 字符串包含三个字母(abs
ac 0 次匹配 字符串不包含三个字母
jim 1 次匹配 字符串包含三个字母
abcd 1 次匹配 字符串包含三个字母
abcjkl 2 次匹配 字符串包含 **6** 个字母(**3 + 3**)

^ - 脱字符

脱字符 ^ 指定字符串以特定字符开头。

例如,

  • 正则表达式 - ^m
  • 匹配 - 以字母 "m" 开头的字符串

让我们检查以下字符串示例是否与正则表达式 ^m 匹配。

字符串 匹配? 原因
man 1 次匹配 man"m" 开头
m 1 次匹配 m"m" 开头
Man 0 次匹配 Man 不以 "m" 开头
sms 0 次匹配 sms 不以 "m" 开头

$ - 美元符号

美元符号 $ 指定字符串以特定字符结尾。

例如,

  • 正则表达式 - y$
  • 匹配 - 以字母 "y" 结尾的字符串

让我们检查以下字符串示例是否与正则表达式 y$ 匹配。

字符串 匹配? 原因
monday 1 次匹配 monday"y" 结尾
say 1 次匹配 say"y" 结尾
myname 0 次匹配 myname 不以 "y" 结尾

* - 星号

星号 * 匹配其左侧模式的零次或多次出现。

例如,

  • 正则表达式 - ca*t
  • 匹配 - 字符串在 ct 之间具有任意数量(包括零个)的 a

让我们检查以下字符串示例是否与正则表达式 ca*t 匹配。

字符串 匹配? 原因
cat 1 次匹配 catct 之间有一个 a
ct 1 次匹配 ctct 之间有零个 a
caaaat 1 次匹配 caaaatct 之间有三个 a
crt 0 次匹配 crtct 之间有一个字母 r(而不是 a)。
caatcaaat 2 次匹配 caatcaaat 在两个位置(caatcaaat)有 a

+ - 加号

加号 + 匹配其左侧模式的一次或多次出现。

例如,

  • 正则表达式 - ma+t
  • 匹配 - 字符串在 mt 之间具有一个或多个 a

让我们检查以下字符串示例是否与正则表达式 ma+t 匹配。

字符串 匹配? 原因
mat 1 次匹配 matmt 之间有一个 a
mt 0 次匹配 mtmt 之间没有 a
matemaat 2 次匹配 matemaat 有两个匹配的子字符串(matmaat)。
mart 0 次匹配 mart 中,a 后面没有 t

? - 问号

问号 ? 匹配其左侧模式的零次或一次出现。

例如,

  • 正则表达式 - ma?n
  • 匹配 - 字符串在 mn 之间有一个或零个 a

让我们检查以下字符串示例是否与正则表达式 ma?n 匹配。

字符串 匹配? 原因
man 1 次匹配 manmn 之间有一个 a
mn 1 次匹配 mnmn 之间有零个 a
maaaaan 0 次匹配 maaaaanmn 之间有多个 a 字符。
woman 1 次匹配 womanmn 之间有一个 a

{} - 花括号

花括号 {} 用于指定其左侧模式的重复次数范围。

例如,

  • 正则表达式 - a{2,3}
  • 匹配 - 字符串在其左侧有至少 **2** 个 a 和最多 **3** 个 a

让我们检查以下字符串示例是否与正则表达式 a{2,3} 匹配。

字符串 匹配? 原因
abcdat 0 次匹配 在其他字符的左侧只有一个 a
abcdaat 1 次匹配 abcdaat 在其他字符的左侧有两个 a
aabc daaat 2 个匹配 aabc daaat 在其他字符的左侧有两个和三个 a

| - 交替

竖线 | 用作 运算符。

例如,

  • 正则表达式 - a|b
  • 匹配 - 字符串包含 ab

让我们检查以下字符串示例是否与正则表达式 a|b 匹配。

字符串 匹配? 原因
cde 0 次匹配 字符串不包含 ab
ade 1 次匹配(在 ade 处匹配) 字符串中有 a
acdbea 3 次匹配(在 acdbea 处匹配) 字符串包含两个 a 和一个 b

() - 圆括号

圆括号 () 用于对子模式进行分组。

例如,

  • 正则表达式 - (a|b|c)xz
  • 匹配 - 包含 abc 后跟 xz 的任何字符串。

让我们检查以下字符串示例是否与正则表达式 (a|b|c)xz 匹配。

字符串 匹配? 原因
abxz 1 次匹配(在 abxz 处匹配) ab 后面是 xz
ab xz 0 次匹配 abxz 之间有一个空格。
axz cabxz 2 次匹配(在 axzbccabxz 处匹配) a 后面是 xzb 后面是 xz

特殊序列

特殊序列可以使常用模式更容易编写。

一些特殊序列是:

\A - 如果指定的字符位于字符串的开头,则匹配。

让我们检查以下字符串示例是否与正则表达式 \Athe 匹配。

字符串 匹配? 原因
the sun 匹配 字符串以 the 开头。
In the 不匹配 字符串不以 the 开头。

\b - 如果指定的字符位于单词的开头或结尾,则匹配。

例如,

  • 正则表达式 - \bfoo
  • 匹配 - 字符串中以 foo 开头的任何单词。

让我们检查以下字符串示例是否与正则表达式 \bfoo 匹配。

字符串 匹配? 原因
football 匹配 foo 位于单词的开头(football)。
a football 匹配 foo 位于单词的开头(a football)。
afootball 不匹配 单词开头是 aafootball)。

再举一个正则表达式的例子,

  • 正则表达式 - foo\b
  • 匹配 - 字符串中以 foo 结尾的任何单词。

让我们检查以下字符串示例是否与正则表达式 foo\b 匹配。

字符串 匹配? 原因
the foo 匹配 foo 位于单词的结尾(the foo)。
the afoo test 匹配 foo 位于单词的结尾(the afoo test)。
the afootest 不匹配 单词结尾没有 foo

\B - 如果指定的字符不位于单词的开头或结尾,则匹配。

例如,

  • 正则表达式 - \Bfoo
  • 匹配 - 字符串中**不**以 foo 开头的任何单词。
字符串 匹配? 原因
football 不匹配 字符串以 foo 开头。
the foo 不匹配 字符串以 foo 开头。
afootball 匹配 字符串不以 foo 开头。

再举一个正则表达式的例子,

  • 正则表达式 - foo\B
  • 匹配 - 字符串中**不**以 foo 结尾的任何单词。

让我们检查以下字符串示例是否与正则表达式 foo\B 匹配。

字符串 匹配? 原因
football 匹配 字符串不以 foo 结尾。
the foo 不匹配 字符串以 foo 结尾。
afootball 匹配 字符串不以 foo 结尾。

\d - 匹配任何十进制数字。等同于 [0-9]

让我们检查以下字符串示例是否与正则表达式 \d 匹配。

字符串 匹配? 原因
12abc3 3 次匹配(在 12abc3 处匹配) 字符串中有三个十进制数字。
programming 不匹配 字符串中没有十进制数字。

\D - 匹配任何非十进制数字。等同于 [^0-9]

让我们检查以下字符串示例是否与正则表达式 \D 匹配。

字符串 匹配? 原因
12abc3 3 次匹配(在 12abc3 处匹配) 字符串中有三个非十进制数字(abc)。
1234 不匹配 字符串中没有非十进制字符。

\s - 匹配字符串中包含的任何空白字符。等同于 [ \t\n\r\f\v]

让我们检查以下字符串示例是否与正则表达式 \s 匹配。

字符串 匹配? 原因
program world 1 次匹配 字符串包含一个空格。
programworld 不匹配 字符串不包含任何空格。

\S - 匹配字符串中包含的任何非空白字符。等同于 [^ \t\n\r\f\v]

让我们检查以下字符串示例是否与正则表达式 \S 匹配。

字符串 匹配? 原因
a b 2 次匹配(在 a b 处匹配) 字符串包含两个非空白字符(ab)。
不匹配 字符串不包含任何非空白字符。

\w - 匹配任何字母数字字符(数字和字母)。等同于 [a-zA-Z0-9_]

让我们检查以下字符串示例是否与正则表达式 \w 匹配。

字符串 匹配? 原因
a2&": ;c 3 次匹配(在 12&": ;c 处匹配) 字符串包含三个字母数字字符(a、**2** 和 **3**)。
%"> ! 不匹配

注意:下划线(_)也被视为字母数字字符。


\W - 匹配任何非字母数字字符。等同于 [^a-zA-Z0-9_]

让我们检查以下字符串示例是否与正则表达式 \W 匹配。

字符串 匹配? 原因
a2%c 1 次匹配(在 a2%c 处匹配) 字符串包含一个非字母数字字符(%)。
apple 不匹配 字符串不包含任何非字母数字字符。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战