目录
[一、Regex.Matches 方法](#一、Regex.Matches 方法)
[二、Matches(String, String, RegexOptions, TimeSpan)](#二、Matches(String, String, RegexOptions, TimeSpan))
[三、Matches(String, String, RegexOptions)](#三、Matches(String, String, RegexOptions))
[四、Matches(String, Int32)](#四、Matches(String, Int32))
[六、Matches(String, String)](#六、Matches(String, String))
可以将正则表达式理解为描述某些规则的工具,使用正则表达式可以方便地对字符串进行查找和替换的操作。
使用正则表达式用Regex类的Matches方法,可以检查字符串中重复出现的词。
一、Regex.Matches 方法
在输入字符串中搜索正则表达式的所有匹配项并返回所有匹配。
1.重载
|-------------------------------------------------|-------------------------------------------|
| Matches(String, String, RegexOptions, TimeSpan) | 使用指定的匹配选项和超时间隔在指定的输入字符串中搜索指定的正则表达式的所有匹配项。 |
| Matches(String, String, RegexOptions) | 使用指定的匹配选项在指定的输入字符串中搜索指定的正则表达式的所有匹配项。 |
| Matches(String, Int32) | 从字符串中的指定起始位置开始,在指定的输入字符串中搜索正则表达式的所有匹配项。 |
| Matches(String) | 在指定的输入字符串中搜索正则表达式的所有匹配项。 |
| Matches(String, String) | 在指定的输入字符串中搜索指定的正则表达式的所有匹配项。 |
二、Matches(String, String, RegexOptions, TimeSpan)
使用指定的匹配选项和超时间隔在指定的输入字符串中搜索指定的正则表达式的所有匹配项。
1.定义
cs
using System.Text.RegularExpressions;
public static MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
参数
input String
要搜索匹配项的字符串。
pattern String
要匹配的正则表达式模式。
options RegexOptions
枚举值的按位组合,这些枚举值指定用于匹配的选项。
matchTimeout TimeSpan
超时间隔;若要指示该方法不应超时,则为 InfiniteMatchTimeout。
返回 MatchCollection
搜索操作找到的 Match 对象的集合。 如果未找到匹配项,则此方法将返回一个空集合对象。
例外
ArgumentException
出现正则表达式分析错误。
ArgumentNullException
input 或 pattern 为 null。
ArgumentOutOfRangeException
options 不是 RegexOptions 值的有效按位组合。
- 或 -
matchTimeout 为负、零或大于 24 天左右。
2.示例
cs
// 调用 Matches(String, String, RegexOptions, TimeSpan) 方法
// 以执行区分大小写的比较,该比较匹配以"es"结尾的句子中的任何单词。
// 然后, 调用Matches(String, String, RegexOptions, TimeSpan) 方法
// 对模式与输入字符串执行不区分大小写的比较。
// 在这两种情况下,超时间隔都设置为 1 秒。
// 这两种方法返回不同的结果。
using System.Text.RegularExpressions;
namespace _084_1
{
public class Example
{
public static void Main()
{
string pattern = @"\b\w+es\b";
string sentence = "NOTES: Any notes or comments are optional.";
// 调用方法不区分大小写
try
{
foreach (Match match in Regex.Matches(sentence, pattern,
RegexOptions.None,
TimeSpan.FromSeconds(1)).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
}
catch (RegexMatchTimeoutException)
{
// Do Nothing: Assume that timeout represents no match.
}
Console.WriteLine();
// 调用方法区分大小写
try
{
foreach (Match match in Regex.Matches(sentence, pattern, RegexOptions.IgnoreCase).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
}
catch (RegexMatchTimeoutException) { }
}
}
}
// 运行结果:
/*
Found 'notes' at position 11
Found 'NOTES' at position 0
Found 'notes' at position 11
*/
其中,正则表达式模式 \b\w+es\b 的定义:\b代表在单词边界处开始匹配。\w+代表匹配一个或多个单词字符。es代表匹配单词尾文本字符串"es"。\b代表在单词边界处结束匹配。
三、Matches(String, String, RegexOptions)
使用指定的匹配选项在指定的输入字符串中搜索指定的正则表达式的所有匹配项。
1.定义
cs
using System.Text.RegularExpressions;
public static MatchCollection Matches (string input, string pattern, RegexOptions options);
参数
input String
要搜索匹配项的字符串。
pattern String
要匹配的正则表达式模式。
options RegexOptions
枚举值的按位组合,这些枚举值指定用于匹配的选项。
返回
MatchCollection
搜索操作找到的 Match 对象的集合。 如果未找到匹配项,则此方法将返回一个空集合对象。
例外
ArgumentException
出现正则表达式分析错误。
ArgumentNullException
input 或 pattern 为 null。
ArgumentOutOfRangeException
options 不是 RegexOptions 值的有效按位组合。
2.示例
cs
// 调用 Matches(String, String) 方法以标识以"es"结尾的句子中的任何单词,
// 再调用 Matches(String, String, RegexOptions) 方法对模式与输入字符串执行不区分大小写的比较。
// 这两种方法返回不同的结果。
using System.Text.RegularExpressions;
namespace _084_2
{
public class Example
{
public static void Main()
{
string pattern = @"\b\w+es\b";
string sentence = "NOTES: Any notes or comments are optional.";
// 调用方法并区别大小写
foreach (Match match in Regex.Matches(sentence, pattern).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
Console.WriteLine();
// 调用方法并不区别大小写
foreach (Match match in Regex.Matches(sentence, pattern, RegexOptions.IgnoreCase).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
}
}
}
// 运行结果:
/*
Found 'notes' at position 11
Found 'NOTES' at position 0
Found 'notes' at position 11
*/
3.示例:用正则表达式检查字符串中重复出现的词
cs
// 用正则表达式检查字符串中重复出现的词
using System.Text.RegularExpressions;
namespace _084
{
public partial class Form1 : Form
{
private GroupBox? groupBox1;
private Label? label1;
private Button? button1;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(16, 31),
Name = "label1",
Size = new Size(43, 17),
TabIndex = 1,
Text = "label1"
};
//
// button1
//
button1 = new Button
{
Location = new Point(151, 70),
Name = "button1",
Size = new Size(75, 23),
TabIndex = 2,
Text = "检查",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// groupBox1
//
groupBox1 = new GroupBox
{
Location = new Point(12, 12),
Name = "groupBox1",
Size = new Size(380, 99),
TabIndex = 0,
TabStop = false,
Text = "检查字符串重复词"
};
groupBox1.Controls.Add(label1);
groupBox1.Controls.Add(button1);
groupBox1.SuspendLayout();
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(404, 123);
Controls.Add(groupBox1);
Name = "Form1";
StartPosition = FormStartPosition.CenterScreen;
Text = "检查字符串中重复出现的词";
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
label1!.Text = "The the quick brown fox fox jumped over the lazy dog dog.";
}
/// <summary>
/// 使用正则表达式查找重复出现单词的集合
/// 如果集合中有内容遍历集合,获取重复出现的单词
/// </summary>
private void Button1_Click(object? sender, EventArgs e)
{
MatchCollection matches = MyRegex().Matches(label1!.Text);
if (matches.Count != 0)
{
//第一种等效foreach,LINQ
foreach (var word in from Match match in matches.Cast<Match>()//Cast强制显示转换
let word = match.Groups["word"].Value
select word)
{
MessageBox.Show(word.ToString(), "英文单词");
}
第二种等效foreach
//foreach (Match match in matches.Cast<Match>())
//{
// string word = match.Groups["word"].Value;
// MessageBox.Show(word.ToString(), "英文单词");
//}
第三种等效for
//for (int i = 0; i < matches.Count; i++)
//{
// Match match = matches[i];
// string word = match.Groups["word"].Value;
// MessageBox.Show(word.ToString(), "英文单词");
//}
}
else { MessageBox.Show("没有重复的单词"); }
}
[GeneratedRegex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled, "zh-CN")]
private static partial Regex MyRegex();
}
}
四、Matches(String, Int32)
从字符串中的指定起始位置开始,在指定的输入字符串中搜索正则表达式的所有匹配项。
1.定义
cs
using System.Text.RegularExpressions;
public MatchCollection Matches (string input, int startat);
参数
input String
要搜索匹配项的字符串。
startat Int32
在输入字符串中开始搜索的字符位置。
返回
MatchCollection
搜索操作找到的 Match 对象的集合。 如果未找到匹配项,则此方法将返回一个空集合对象。
例外
ArgumentNullException
input 为 null。
ArgumentOutOfRangeException
startat 小于零或大于 input 的长度。
2.示例
cs
// 使用 Match(String) 方法查找以"es"结尾的句子中的第一个单词,
// 然后调用 Matches(String, Int32) 方法以标识以"es"结尾的任何其他单词。
using System.Text.RegularExpressions;
namespace _084_3
{
public class Example
{
public static void Main()
{
string pattern = @"\b\w+es\b";
Regex regex = new(pattern);
string sentence = "Who writes these notes and uses our paper?";
// Get the first match.
Match match = regex.Match(sentence);
if (match.Success)
{
Console.WriteLine("Found first 'es' in '{0}' at position {1}",
match.Value, match.Index);
// Get any additional matches.
foreach (Match m in regex.Matches(sentence, match.Index + match.Length).Cast<Match>())
Console.WriteLine("Also found '{0}' at position {1}",
m.Value, m.Index);
}
}
}
}
// 运行结果:
/*
Found first 'es' in 'writes' at position 4
Also found 'notes' at position 17
Also found 'uses' at position 27
*/
五、Matches(String)
在指定的输入字符串中搜索正则表达式的所有匹配项。
cs
using System.Text.RegularExpressions;
public MatchCollection Matches (string input);
参数
input String
要搜索匹配项的字符串。
返回
MatchCollection
搜索操作找到的 Match 对象的集合。 如果未找到匹配项,则此方法将返回一个空集合对象。
例外
ArgumentNullException
input 为 null。
六、Matches(String, String)
在指定的输入字符串中搜索指定的正则表达式的所有匹配项。
1.定义
cs
using System.Text.RegularExpressions;
public static MatchCollection Matches (string input, string pattern);
参数
input String
要搜索匹配项的字符串。
pattern String
要匹配的正则表达式模式。
返回
MatchCollection
搜索操作找到的 Match 对象的集合。 如果未找到匹配项,则此方法将返回一个空集合对象。
例外
ArgumentException
出现正则表达式分析错误。
ArgumentNullException
input 或 pattern 为 null。
2.源码
cs
// 使用 Matches(String, String) 方法标识以"es"结尾的句子中的任何单词。
// 使用 Matches(String) 方法标识以"es"结尾的句子中的任何单词。
using System.Text.RegularExpressions;
namespace _084_4
{
public class Example
{
/// <summary>
/// Matches(sentence, pattern)是静态方法
/// Matches(sentence)不支持静态方法
/// </summary>
public static void Main()
{
string pattern = @"\b\w+es\b";
string sentence = "Who writes these notes?";
foreach (Match match in Regex.Matches(sentence, pattern).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
Console.WriteLine("****************************");
Regex regex = new(pattern);
foreach (Match match in regex.Matches(sentence).Cast<Match>())
Console.WriteLine("Found '{0}' at position {1}",
match.Value, match.Index);
}
}
}
// 运行结果:
/*
Found 'writes' at position 4
Found 'notes' at position 17
****************************
Found 'writes' at position 4
Found 'notes' at position 17
*/