.net 正则表达式
在 .net 中,正则表达式是一个非常强大的工具,用于处理和匹配文本数据。正则表达式通过定义模式来匹配文本,这种模式可以匹配特定字符、字符集、位置、数量等,非常有用。在 .net 中,正则表达式被封装在 System.Text.RegularExpressions 命名空间中,提供了一些类和方法,让我们可以方便地使用它。
正则表达式基础
在 .net 中,正则表达式主要由以下三个部分组成:元字符、字符集和量词。
元字符
元字符是正则表达式的基础,它们是一些特殊字符,通常用于匹配文本中的特定字符或位置。下面是一些 .net 中常用的元字符:
- .:匹配任意字符,除了新行符(\n)和回车符(\r)之外;
- \d:匹配数字字符,相当于 [0-9];
- \D:匹配非数字字符,相当于 [^0-9];
- \w:匹配单词字符,包括字母、数字和下划线,相当于 [a-zA-Z0-9_];
- \W:匹配非单词字符,相当于 [^a-zA-Z0-9_];
- \s:匹配空白字符,包括空格、制表符、新行符等等;
- \S:匹配非空白字符。
在正则表达式中,元字符需要使用反斜杠(\)进行转义,例如匹配句点字符(.)需要写成 .。
以下是一个简单的例子,用正则表达式匹配以字母“a”开头,并且后面跟着任意字符和一个数字的字符串:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "apple1, banana2, cherry3";
string pattern = "^a.+\\d$";
bool match = Regex.IsMatch(input, pattern);
Console.WriteLine(match);
}
}
运行程序,输出为 true,表示匹配成功。
字符集
字符集用于匹配一组特定的字符。在 .net 中,字符集可以使用方括号([])表示。方括号中的字符是要匹配的字符集,例如 [abc] 表示匹配字符 “a”、“b” 或 “c”。
字符集可以使用连字符(-)表示一个连续的字符范围,例如 [a-z] 表示匹配小写字母a到z中的任意字符。也可以使用 ^ 表示一个字符集的补集,例如 [^abc] 表示不匹配字符 “a”、“b” 或 “c”。
以下是一个简单的例子,用正则表达式匹配一个符合特定格式的数字字符串:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "123-45-6789";
string pattern = "^\\d{3}-\\d{2}-\\d{4}$";
bool match = Regex.IsMatch(input, pattern);
Console.WriteLine(match);
}
}
运行程序,输出为 true,表示匹配成功。
量词
量词用于匹配特定字符或字符集的数量。在 .net 中,量词可以使用以下几种符号表示:
- +:匹配前面的字符或字符集一次或多次;
- *:匹配前面的字符或字符集零次或多次;
- ?:匹配前面的字符或字符集零次或一次;
- {n}:匹配前面的字符或字符集恰好 n 次;
- {n,}:匹配前面的字符或字符集至少 n 次;
- {n,m}:匹配前面的字符或字符集至少 n 次,但不超过 m 次。
以下是一个简单的例子,用正则表达式匹配包含至少一个数字和一个字母的字符串:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "abc123";
string pattern = "^(?=.*\\d)(?=.*[a-zA-Z]).+$";
bool match = Regex.IsMatch(input, pattern);
Console.WriteLine(match);
}
}
运行程序,输出为 true,表示匹配成功。
正则表达式实战
以上是 .net 正则表达式的基础知识,接下来我们将介绍一些实际应用场景,帮助读者更好地理解和掌握正则表达式。
邮箱地址验证
邮箱地址是我们经常遇到的一种数据类型,验证邮箱地址的合法性可以使用正则表达式。以下是一个匹配邮箱地址的正则表达式:
^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*\\.([A-Za-z]){2,6}$
该正则表达式可以分为以下几个部分:
- ^(?=.{1,64}@):以 @ 符号之前的字符串长度不超过 64 个字符开始;
- [A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*@:匹配邮箱地址的用户名部分,由字母、数字、下划线和连字符组成,可以包含一或多个以句点(.)分隔的子串;
- [A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*\.:匹配邮箱地址的域名部分(不包括顶级域名),可以包含一或多个以句点(.)分隔的子串;
- ([A-Za-z]){2,6}$:匹配邮箱地址的顶级域名部分,由两到六个字母组成。
以下是一个使用正则表达式验证邮箱地址的例子:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "example@gmail.com";
string pattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*\\.([A-Za-z]){2,6}$";
bool match = Regex.IsMatch(input, pattern);
Console.WriteLine(match);
}
}
运行程序,输出为 true,表示邮箱地址合法。
身份证号码验证
身份证号码是中国公民的唯一身份证明,验证身份证号码的合法性也可以使用正则表达式。以下是一个匹配身份证号码的正则表达式:
^(\\d{15})|^(\\d{17}[0-9Xx])
该正则表达式可以分为以下两个部分:
- ^(\d{15})$:匹配 15 位身份证号码;
- ^(\d{17}[0-9Xx])$:匹配 18 位身份证号码,其中末位可能是数字或字母 X。
以下是一个使用正则表达式验证身份证号码的例子:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "320721199001010012";
string pattern = "^(\\d{15})|^(\\d{17}[0-9Xx])";
bool match = Regex.IsMatch(input, pattern);
Console.WriteLine(match);
}
}
运行程序,输出为 true,表示身份证号码合法。
HTML 标签匹配
在网页开发中,经常需要从 HTML 代码中提取出特定的标签或内容。以下是一个匹配 img 标签的正则表达式:
<(img|IMG)(.*?)(/>|></img>|>)
该正则表达式可以匹配 img 或 IMG 标签,可以包含任意属性,并且可以是自闭合标签(以 /> 结尾)或包含结束标记(以 或 > 结尾)。
以下是一个使用正则表达式从 HTML 代码中提取出所有 img 标签的例子:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "<img src=\"image.jpg\" alt=\"A beautiful image\"> <img src=\"image2.jpg\">";
string pattern = "<(img|IMG)(.*?)(/>|></img>|>)";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
}
}
运行程序,将输出两个 img 标签的内容。
结论
正则表达式是一个非常强大、灵活和实用的工具,可以帮助我们在文本处理和匹配中更加高效、准确地完成任务。在 .net 中,我们可以使用 System.Text.RegularExpressions 命名空间提供的类和方法,方便地使用正则表达式。无论是邮箱地址验证、身份证号码验证,还是从 HTML 代码中提取特定标签或内容,正则表达式都可以为我们提供便利和效率。