本文探讨正则表达式在C#中的应用,详细介绍了Regex类的IsMatch方法的各种重载形式,包括基本匹配、指定起始位置的匹配、使用匹配选项以及设置超时间隔的高级匹配技巧。
Regex.IsMatch 方法
定义
命名空间:System.Text.RegularExpressions
程序集:System.Text.RegularExpressions.dll, System.dll, netstandard.dll
指示正则表达式在输入字符串中是否找到匹配项。
重载
1、 IsMatch(String) 指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中是否找到了匹配项。
2、 IsMatch(String, Int32) 指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中,从该字符串中的指定起始位置开始是否找到了匹配项。
3、 IsMatch(String, String) 指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。
4、 IsMatch(String, String, RegexOptions) 指示所指定的正则表达式是否使用指定的匹配选项在指定的输入字符串中找到了匹配项。
5、 IsMatch(String, String, RegexOptions, TimeSpan) 指示所指定的正则表达式是否使用指定的匹配选项和超时间隔在指定的输入字符串中找到了匹配项。
1、IsMatch(String)
public bool IsMatch (string input);
参数 input 为 String 类型 ,表示要搜索匹配项的字符串。
返回值为 Boolean 类型,如果正则表达式找到匹配项,则为 true;否则为 false。
异常 ArgumentNullException
input 为 null。
RegexMatchTimeoutException
发生超时。
示例
下面的示例演示如何使用 IsMatch(String) 方法来确定字符串是否是有效的部件号。 正则表达式假定部件号具有特定的格式,该格式包含三组由连字符分隔的字符。 包含四个字符的第一个集必须包含一个字母数字字符,后跟两个数字字符后跟一个字母数字字符。 由三个字符组成的第二个集必须为数字。 第三个集由四个字符组成,必须有三个数字字符后跟一个字母数字字符。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] partNumbers= { "1298-673-4192", "A08Z-931-468A",
"_A90-123-129X", "12345-KKA-1230",
"0919-2893-1256" };
Regex rgx = new Regex(@"^[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$");
foreach (string partNumber in partNumbers)
Console.WriteLine("{0} {1} a valid part number.",
partNumber,
rgx.IsMatch(partNumber) ? "is" : "is not");
}
}
// The example displays the following output:
// 1298-673-4192 is a valid part number.
// A08Z-931-468A is a valid part number.
// _A90-123-129X is not a valid part number.
// 12345-KKA-1230 is not a valid part number.
// 0919-2893-1256 is not a valid part number.
正则表达式模式为:
^[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$

注解
IsMatch 方法通常用于验证字符串或确保字符串符合特定模式,而不检索该字符串进行后续操作。 如果要确定一个或多个字符串是否与正则表达式模式匹配,然后检索它们以供后续操作,请调用 Match 或 Matches 方法。
如果匹配操作的执行时间超过了 Regex.Regex(String, RegexOptions, TimeSpan) 构造函数指定的超时间隔,则会引发 RegexMatchTimeoutException 异常。 如果在调用构造函数时未设置超时间隔,则当操作超过为创建 Regex 对象的应用程序域建立的任何超时值时,将引发异常。 如果在 Regex 构造函数调用或应用程序域的属性中没有定义超时值,或者如果 Regex.InfiniteMatchTimeout超时值,则不会引发异常。
2、IsMatch(String, Int32)
指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中,从该字符串中的指定起始位置开始是否找到了匹配项。
public bool IsMatch (string input, int startat);
参数 input 是 String 类型,表示要搜索匹配项的字符串。
startat 是Int32 类型,表示开始搜索的字符位置。
返回 Boolean 类型返回值,如果正则表达式找到匹配项,则为 true;否则为 false。
异常
ArgumentNullException,input 为 null。
ArgumentOutOfRangeException
startat 小于零或大于 input 的长度。
RegexMatchTimeoutException
发生超时。
示例
下面的示例演示如何使用 IsMatch(String, Int32) 方法来确定字符串是否是有效的部件号。它搜索跟在冒号(:)字符串中的字符。 IndexOf(Char) 方法用于确定冒号字符的位置,然后将其传递给 IsMatch(String, Int32) 方法。 正则表达式假定部件号具有特定的格式,该格式包含三组由连字符分隔的字符。 包含四个字符的第一个集必须包含一个字母数字字符,后跟两个数字字符后跟一个字母数字字符。 由三个字符组成的第二个集必须为数字。 第三个集由四个字符组成,必须有三个数字字符后跟一个字母数字字符。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] partNumbers= { "Part Number: 1298-673-4192", "Part No: A08Z-931-468A",
"_A90-123-129X", "123K-000-1230",
"SKU: 0919-2893-1256" };
Regex rgx = new Regex(@"[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$");
foreach (string partNumber in partNumbers)
{
int start = partNumber.IndexOf(':');
if (start >= 0)
{
Console.WriteLine("{0} {1} a valid part number.",
partNumber,
rgx.IsMatch(partNumber, start) ? "is" : "is not");
}
else
{
Console.WriteLine("Cannot find starting position in {0}.", partNumber);
}
}
}
}
// The example displays the following output:
// Part Number: 1298-673-4192 is a valid part number.
// Part No: A08Z-931-468A is a valid part number.
// Cannot find starting position in _A90-123-129X.
// Cannot find starting position in 123K-000-1230.
// SKU: 0919-2893-1256 is not a valid part number.
正则表达式模式为:
[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$
下表演示了如何解释正则表达式模式。

注解
IsMatch 方法通常用于验证字符串或确保字符串符合特定模式,而不检索该字符串进行后续操作。 如果要确定一个或多个字符串是否与正则表达式模式匹配,然后检索它们以供后续操作,请调用 Match 或 Matches 方法。
如果匹配操作的执行时间超过了 Regex.Regex(String, RegexOptions, TimeSpan) 构造函数指定的超时间隔,则会引发 RegexMatchTimeoutException 异常。 如果在调用构造函数时未设置超时间隔,则当操作超过为创建 Regex 对象的应用程序域建立的任何超时值时,将引发异常。 如果在 Regex 构造函数调用或应用程序域的属性中没有定义超时值,或者如果 Regex.InfiniteMatchTimeout超时值,则不会引发异常。
IsMatch(String, String)
指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。
public static bool IsMatch (string input, string pattern);
参数
input 是 String 类型的,要搜索匹配项的字符串。
pattern 是 String 类型的,表示要匹配的正则表达式模式。
返回值是 Boolean 类型,如果正则表达式找到匹配项,则为 true;否则为 false。
异常 ArgumentException,出现正则表达式分析错误。
ArgumentNullException,input 或 pattern 为 null。RegexMatchTimeoutException
生超时。
示例
下面的示例演示如何使用 IsMatch(String, String) 方法来确定字符串是否是有效的部件号。正则表达式假定部件号具有特定的格式,该格式包含三组由连字符分隔的字符。 包含四个字符的第一个集必须包含一个字母数字字符,后跟两个数字字符后跟一个字母数字字符。由三个字符组成的第二个集必须为数字。 第三个集由四个字符组成,必须有三个数字字符后跟一个字母数字字符。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] partNumbers= { "1298-673-4192", "A08Z-931-468A",
"_A90-123-129X", "12345-KKA-1230",
"0919-2893-1256" };
string pattern = @"^[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$";
foreach (string partNumber in partNumbers)
Console.WriteLine("{0} {1} a valid part number.",
partNumber,
Regex.IsMatch(partNumber, pattern) ? "is" : "is not");
}
}
// The example displays the following output:
// 1298-673-4192 is a valid part number.
// A08Z-931-468A is a valid part number.
// _A90-123-129X is not a valid part number.
// 12345-KKA-1230 is not a valid part number.
// 0919-2893-1256 is not a valid part number.
正则表达式模式为:
^[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$

注解
IsMatch 方法通常用于验证字符串或确保字符串符合特定模式,而不检索该字符串进行后续操作。 如果要确定一个或多个字符串是否与正则表达式模式匹配,然后检索它们以供后续操作,请调用 Match 或 Matches 方法。
静态 IsMatch(String, String) 方法等效于使用 pattern 指定的正则表达式模式构造 Regex对象,并调用 IsMatch(String) 实例方法。 此正则表达式模式将缓存,以便正则表达式引擎进行快速检索。
pattern 参数包含符号描述要匹配的字符串的正则表达式语言元素。 有关正则表达式的详细信息,请参阅.NET Framework 正则表达式和正则表达式语言-快速参考。
如果匹配操作的执行时间超过为其调用该方法的应用程序域指定的超时间隔,则会引发 RegexMatchTimeoutException 异常。 如果在应用程序域的属性中未定义超时值,或者如果 Regex.InfiniteMatchTimeout超时值,则不会引发异常。
调用方说明
此方法在与调用方法的应用程序域的默认超时值相等的时间间隔后超时。 如果尚未为应用程序域定义超时值,则将使用值 InfiniteMatchTimeout,这会阻止方法超时。 用于验证模式匹配的建议静态方法是 IsMatch(String, String, RegexOptions, TimeSpan),这允许您设置超时间隔。
IsMatch(String, String, RegexOptions)
指示所指定的正则表达式是否使用指定的匹配选项在指定的输入字符串中找到了匹配项。
public static bool IsMatch (string input, string pattern, System.Text.RegularExpressions.RegexOptions options);
参数
input 是String 类型的,表示要搜索匹配项的字符串。
pattern 是String 类型的,表示要匹配的正则表达式模式。
options 是 RegexOptions 类型的,表示枚举值的一个按位组合,这些枚举值提供匹配选项。
返回值是 Boolean 类型的,表示如果正则表达式找到匹配项,则为 true;否则为 false。
异常
ArgumentException
出现正则表达式分析错误。
ArgumentNullException
input 或 pattern 为 null。
ArgumentOutOfRangeException
options 不是有效的 RegexOptions 值。
RegexMatchTimeoutException
发生超时。
示例
下面的示例演示如何使用 IsMatch(String, String) 方法来确定字符串是否是有效的部件号。正则表达式假定部件号具有特定的格式,该格式包含三组由连字符分隔的字符。 包含四个字符的第一个集必须包含一个字母数字字符,后跟两个数字字符后跟一个字母数字字符。由三个字符组成的第二个集必须为数字。 第三个集由四个字符组成,必须有三个数字字符后跟一个字母数字字符。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] partNumbers= { "1298-673-4192", "A08Z-931-468a",
"_A90-123-129X", "12345-KKA-1230",
"0919-2893-1256" };
string pattern = @"^[A-Z0-9]\d{2}[A-Z0-9](-\d{3}){2}[A-Z0-9]$";
foreach (string partNumber in partNumbers)
Console.WriteLine("{0} {1} a valid part number.",
partNumber,
Regex.IsMatch(partNumber, pattern, RegexOptions.IgnoreCase)
? "is" : "is not");
}
}
// The example displays the following output:
// 1298-673-4192 is a valid part number.
// A08Z-931-468a is a valid part number.
// _A90-123-129X is not a valid part number.
// 12345-KKA-1230 is not a valid part number.
// 0919-2893-1256 is not a valid part number.
正则表达式模式为:
^[A-Z0-9]\d{2}[A-Z0-9](-\d{3}){2}[A-Z0-9]$
在将 options 参数设置为 RegexOptions.IgnoreCase 时调用 IsMatch(String, String, RegexOptions) 方法等效于定义以下正则表达式:
[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]
注解
IsMatch 方法通常用于验证字符串或确保字符串符合特定模式,而不检索该字符串进行后续操作。 如果要确定一个或多个字符串是否与正则表达式模式匹配,然后检索它们以供后续操作,请调用 Match 或 Matches 方法。
静态 IsMatch(String, String, RegexOptions) 方法等效于使用 pattern 指定的正则表达式模式构造 Regex 对象,并使用 options 指定的正则表达式选项并调用 IsMatch(String) 实例方法。 此正则表达式模式将缓存,以便正则表达式引擎进行快速检索。
pattern 参数包含符号描述要匹配的字符串的正则表达式语言元素。 有关正则表达式的详细信息,请参阅.NET Framework 正则表达式和正则表达式语言-快速参考。
如果匹配操作的执行时间超过为其调用该方法的应用程序域指定的超时间隔,则会引发 RegexMatchTimeoutException 异常。 如果在应用程序域的属性中未定义超时值,或者如果 Regex.InfiniteMatchTimeout超时值,则不会引发异常。
调用方说明
此方法在与调用该方法的应用程序域的默认超时值相等的时间间隔后超时。 如果尚未为应用程序域定义超时值,则将使用值 InfiniteMatchTimeout,这会阻止方法超时。 用于验证模式匹配的建议静态方法是 IsMatch(String, String, RegexOptions, TimeSpan),这允许您设置超时间隔。
IsMatch(String, String, RegexOptions, TimeSpan)
指示所指定的正则表达式是否使用指定的匹配选项和超时间隔在指定的输入字符串中找到了匹配项。
public static bool IsMatch (string input, string pattern, System.Text.RegularExpressions.RegexOptions options, TimeSpan matchTimeout);
参数
input 是String 类型,表示要搜索匹配项的字符串。
pattern 是 String 类型,表示要匹配的正则表达式模式。
options 是 RegexOptions 类型
枚举值的一个按位组合,这些枚举值提供匹配选项。
matchTimeout
TimeSpan
超时间隔;若要指示该方法不应超时,则为 InfiniteMatchTimeout。
返回
Boolean
如果正则表达式找到匹配项,则为 true;否则为 false。
异常
ArgumentException
出现正则表达式分析错误。
ArgumentNullException
input 或 pattern 为 null。
ArgumentOutOfRangeException
options 不是有效的 RegexOptions 值。
-或- matchTimeout 为负、零或大于 24 天左右。
RegexMatchTimeoutException
发生超时。
示例
下面的示例演示如何使用 IsMatch(String, String, RegexOptions, TimeSpan) 方法来确定字符串是否是有效的部件号。 正则表达式假定部件号具有特定的格式,该格式包含三组由连字符分隔的字符。 包含四个字符的第一个集必须包含一个字母数字字符,后跟两个数字字符后跟一个字母数字字符。 由三个字符组成的第二个集必须为数字。 第三个集由四个字符组成,必须有三个数字字符后跟一个字母数字字符。 匹配正则表达式模式应涉及到最小搜索输入字符串,因此该方法将超时间隔设置为500毫秒。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string[] partNumbers= { "1298-673-4192", "A08Z-931-468a",
"_A90-123-129X", "12345-KKA-1230",
"0919-2893-1256" };
string pattern = @"^[A-Z0-9]\d{2}[A-Z0-9](-\d{3}){2}[A-Z0-9]$";
foreach (string partNumber in partNumbers)
try {
Console.WriteLine("{0} {1} a valid part number.",
partNumber,
Regex.IsMatch(partNumber, pattern, RegexOptions.IgnoreCase)
? "is" : "is not", TimeSpan.FromMilliseconds(500));
}
catch (RegexMatchTimeoutException e) {
Console.WriteLine("Timeout after {0} seconds matching {1}.",
e.MatchTimeout, e.Input);
}
}
}
// The example displays the following output:
// 1298-673-4192 is a valid part number.
// A08Z-931-468a is a valid part number.
// _A90-123-129X is not a valid part number.
// 12345-KKA-1230 is not a valid part number.
// 0919-2893-1256 is not a valid part number.
正则表达式模式为:
^[A-Z0-9]\d{2}[A-Z0-9](-\d{3}){2}[A-Z0-9]$
在将 options 参数设置为 RegexOptions.IgnoreCase 时调用 IsMatch(String, String, RegexOptions, TimeSpan) 方法等效于定义以下正则表达式:
[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]
若要进行比较,请参阅 IsMatch(String, String) 方法的示例。
注解
IsMatch 方法通常用于验证字符串或确保字符串符合特定模式,而不检索该字符串进行后续操作。 如果要确定一个或多个字符串是否与正则表达式模式匹配,然后检索它们以供后续操作,请调用 Match 或 Matches 方法。
静态 IsMatch(String, String, RegexOptions, TimeSpan) 方法等效于使用 pattern 指定的正则表达式模式构造 Regex 对象,并使用 options 指定的正则表达式选项并调用 IsMatch(String) 实例方法。 此正则表达式模式将缓存,以便正则表达式引擎进行快速检索。
pattern 参数包含符号描述要匹配的字符串的正则表达式语言元素。 有关正则表达式的详细信息,请参阅.NET Framework 正则表达式和正则表达式语言-快速参考。
matchTimeout 参数指定模式匹配方法在超时之前应尝试找到匹配项的时间长度。设置超时间隔可防止正则表达式在处理包含接近匹配项的输入时,这些表达式会出现依赖于过量回溯的正则表达式停止响应。 有关详细信息,请参阅正则表达式和回溯的最佳实践。 如果在该时间间隔内未找到匹配项,则该方法将引发 RegexMatchTimeoutException 异常。matchTimeout 覆盖为在其中执行该方法的应用程序域定义的任何默认超时值。
调用方说明
建议将 matchTimeout 参数设置为适当的值,例如两秒钟。 如果通过指定 InfiniteMatchTimeout禁用超时,则正则表达式引擎可提供略微更好的性能。 但是,只应在以下条件下禁用超时: -正则表达式处理的输入派生自已知的和受信任的源,或由静态文本组成。 这不包括用户动态输入的文本。
-对正则表达式模式进行了全面测试,以确保它有效地处理匹配、不匹配和接近匹配项。
-当正则表达式模式不包含已知的语言元素时,这些元素会导致在处理接近的匹配时导致过度回溯。