正则表达式(**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"
在 a
和 e
之间有超过三个字母。
注意:我们将正则表达式指定为字符串。例如,
string pattern = "^a...e$";
正则表达式如何工作?
在 C# 中,有一个称为正则表达式引擎的引擎,它在内部检查给定字符串中的正则表达式。

在上图中,正则表达式引擎处理两个输入:
^a…e$
- 正则表达式模式"apple"
- 我们想匹配的给定字符串
当正则表达式模式被传入引擎时,它会被解析。然后,引擎负责搜索操作,即使用户输入字符串匹配正则表达式模式。
元字符
为了指定正则表达式,使用了元字符。元字符是由正则表达式引擎以特殊方式解释的字符。
一些基本元字符是:
[]
- 方括号.
- 点^
- 脱字符$
- 美元符号*
- 星号+
- 加号?
- 问号{}
- 花括号()
- 圆括号|
- 交替
[]- 方括号
[]
指定了您希望匹配的字符集。
例如,
- 正则表达式 -
[abc]
- 匹配 - 包含
a
、b
或c
的任何字符串。
让我们检查以下字符串示例是否与正则表达式 [abc]
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
a | 1 次匹配 | 字符串包含 a |
ac | 2 次匹配 | 字符串包含 a 和 c |
jim | 0 次匹配 | 字符串不包含 a 、b 或 c |
abc | 3 次匹配 | 字符串包含所有三个 - a 、b 和 c |
注意:您也可以使用方括号内的 -
来指定字符范围。例如,
[a-e]
等同于[abcde]
[0-3]
等同于[0123]
. - 点
点表示任何单个字符(换行符 '\n'
除外)。
例如,
- 正则表达式 -
…
- 匹配 - 包含三个字母的字符串
让我们检查以下字符串示例是否与正则表达式 …
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
abs | 1 次匹配 | 字符串包含三个字母(a 、b 、s ) |
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
- 匹配 - 字符串在
c
和t
之间具有任意数量(包括零个)的a
。
让我们检查以下字符串示例是否与正则表达式 ca*t
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
cat | 1 次匹配 | cat 在 c 和 t 之间有一个 a 。 |
ct | 1 次匹配 | ct 在 c 和 t 之间有零个 a 。 |
caaaat | 1 次匹配 | caaaat 在 c 和 t 之间有三个 a 。 |
crt | 0 次匹配 | crt 在 c 和 t 之间有一个字母 r (而不是 a )。 |
caatcaaat | 2 次匹配 | caatcaaat 在两个位置(caat 和 caaat )有 a 。 |
+ - 加号
加号 +
匹配其左侧模式的一次或多次出现。
例如,
- 正则表达式 -
ma+t
- 匹配 - 字符串在
m
和t
之间具有一个或多个a
。
让我们检查以下字符串示例是否与正则表达式 ma+t
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
mat | 1 次匹配 | mat 在 m 和 t 之间有一个 a 。 |
mt | 0 次匹配 | mt 在 m 和 t 之间没有 a 。 |
matemaat | 2 次匹配 | matemaat 有两个匹配的子字符串(mat 和 maat )。 |
mart | 0 次匹配 | 在 mart 中,a 后面没有 t 。 |
? - 问号
问号 ?
匹配其左侧模式的零次或一次出现。
例如,
- 正则表达式 -
ma?n
- 匹配 - 字符串在
m
和n
之间有一个或零个a
。
让我们检查以下字符串示例是否与正则表达式 ma?n
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
man | 1 次匹配 | man 在 m 和 n 之间有一个 a 。 |
mn | 1 次匹配 | mn 在 m 和 n 之间有零个 a 。 |
maaaaan | 0 次匹配 | maaaaan 在 m 和 n 之间有多个 a 字符。 |
woman | 1 次匹配 | woman 在 m 和 n 之间有一个 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
- 匹配 - 字符串包含
a
或b
。
让我们检查以下字符串示例是否与正则表达式 a|b
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
cde | 0 次匹配 | 字符串不包含 a 或 b 。 |
ade | 1 次匹配(在 ade 处匹配) |
字符串中有 a 。 |
acdbea | 3 次匹配(在 acdbea 处匹配) |
字符串包含两个 a 和一个 b 。 |
() - 圆括号
圆括号 ()
用于对子模式进行分组。
例如,
- 正则表达式 -
(a|b|c)xz
- 匹配 - 包含
a
、b
或c
后跟xz
的任何字符串。
让我们检查以下字符串示例是否与正则表达式 (a|b|c)xz
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
abxz | 1 次匹配(在 abxz 处匹配) |
a 或 b 后面是 xz 。 |
ab xz | 0 次匹配 | ab 和 xz 之间有一个空格。 |
axz cabxz | 2 次匹配(在 axzbc 和 cabxz 处匹配) |
a 后面是 xz ,b 后面是 xz 。 |
特殊序列
特殊序列可以使常用模式更容易编写。
一些特殊序列是:
\A
- 如果指定的字符位于字符串的开头,则匹配。
让我们检查以下字符串示例是否与正则表达式 \Athe
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
the sun | 匹配 | 字符串以 the 开头。 |
In the | 不匹配 | 字符串不以 the 开头。 |
\b
- 如果指定的字符位于单词的开头或结尾,则匹配。
例如,
- 正则表达式 -
\bfoo
- 匹配 - 字符串中以
foo
开头的任何单词。
让我们检查以下字符串示例是否与正则表达式 \bfoo
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
football | 匹配 | foo 位于单词的开头(football )。 |
a football | 匹配 | foo 位于单词的开头(a football )。 |
afootball | 不匹配 | 单词开头是 a (afootball )。 |
再举一个正则表达式的例子,
- 正则表达式 -
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 处匹配) |
字符串中有三个非十进制数字(a 、b 和 c )。 |
1234 | 不匹配 | 字符串中没有非十进制字符。 |
\s
- 匹配字符串中包含的任何空白字符。等同于 [ \t\n\r\f\v]
。
让我们检查以下字符串示例是否与正则表达式 \s
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
program world | 1 次匹配 | 字符串包含一个空格。 |
programworld | 不匹配 | 字符串不包含任何空格。 |
\S
- 匹配字符串中包含的任何非空白字符。等同于 [^ \t\n\r\f\v]
。
让我们检查以下字符串示例是否与正则表达式 \S
匹配。
字符串 | 匹配? | 原因 |
---|---|---|
a b | 2 次匹配(在 a b 处匹配) |
字符串包含两个非空白字符(a 和 b )。 |
不匹配 | 字符串不包含任何非空白字符。 |
\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 | 不匹配 | 字符串不包含任何非字母数字字符。 |