正则表达式(**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 | 不匹配 | 字符串不包含任何非字母数字字符。 |