正则表达式
using System.Text.RegularExpressions;
^符号匹配字符串的开头。
$符号匹配字符串的结尾。
*符号匹配0个或多个前面的字符。
+符号匹配至少一个前面的字符。
?符号匹配0个或1个前面的字符。
.符号匹配除换行符以外的任何字符。
x|y匹配“x”或“y”。
{n}匹配恰好n次(n为非负整数)前面的字符。
{n,}匹配至少n次(n为非负整数)前面的字符。
{m,n}匹配至少m个,至多n个前面的字符。
[xyz]表示一个字符集,匹配括号中字符的其中之一。
[abc] 匹配“a”、“b”和“c”
[^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符。
[a-z]表示某个范围内的字符,匹配指定区间内的任何字符。例如:
[^m-n]表示某个范围之外的字符,匹配不在指定范围内的字符。例如:
\符号是转义操作符。例如:
\n 换行符
\f 分页符
\r 回车
\t 制表符
\v 垂直制表符
\\ 匹配“\”
\/ 匹配“/”
\s 任何白字符,包括空格、制表符、分页符等。等价于“[ \f\n\r\t\v]”
\S 任何非空白的字符。等价于“^\f\n\r\t\v]”
\w 任何单词字符,包括字母和下划线。等价于“[A-Za-z0-9_]”
\W 任何非单词字符。等价于“[^A-Za-z0-9_]”
\b匹配单词的结尾。
\B匹配单词的开头。
\d匹配一个数字字符,等价于[0-9]。
\D匹配一个非数字字符,等价于[^0-9]。
\NUM匹配NUM个(其中NUM为一个正整数),引用回到记住的匹配。例如:
(.)\1 匹配两个连续相同的字符。
\oNUM匹配n(其中n为一个小于256的八进制换码值)。例如:
\o011 匹配制表符
\xNUM匹配NUM(其中NUM为一个小于256的十六进制换码值)。例如:
\x41 匹配字符“A”
"^\d+$" //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$" //正整数
"^((-\d+)|(0+))$" //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$" //负整数
"^-?\d+$" //整数
"^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
"^(-?\d+)(\.\d+)?$" //浮点数
"^[A-Za-z]+$" //由26个英文字母组成的字符串
"^[A-Z]+$" //由26个英文字母的大写组成的字符串
"^[a-z]+$" //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
"^\w+$" //由数字、26个英文字母或者下划线组成的字符串
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url
$number 替换由组号 number(十进制)匹配的最后一个子字符串。
${name} 替换由 (?<name>
组匹配的最后一个子字符串。
$$ 替换单个“$”字符。
$& 替换完全匹配本身的一个副本。
$` 替换匹配前的输入字符串的所有文本。
$' 替换匹配后的输入字符串的所有文本。
$+ 替换最后捕获的组。
$_ 替换整个输入字符串。
分组构造
(
捕获匹配的子字符串(或非捕获组;有关详细信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。
(?<name>
将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?'name')。
(?<name1-name2>
平衡组定义。删除先前定义的 name2 组的定义并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器以跟踪嵌套构造(如括号)。在此构造中,name1 是可选的。可以使用单引号替代尖括号,例如 (?'name1-name2')。
(?:
非捕获组。
(?imnsx-imnsx:
应用或禁用子表达式中指定的选项。例如,(?i-s:
将打开不区分大小写并禁用单行模式。有关详细信息,请参见正则表达式选项。
(?=
零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!
零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。
(?<=
零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!
零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。
(?>
非回溯子表达式(也称为“贪婪”子表达式)。该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。)
Regex 类有大量的方法和属性,如果您以前没有用过它,可能会感到无所适从。下面汇总了一些最常用的方法:
方法 说明
Escape / Unescape
字符串中的转义元字符,用作表达式中的文字。
IsMatch
如果正则表达式在输入字符串中发现匹配,返回“Ture”。
例如,下面的函数演示了如何使用正则表达式验证邮政编码:
private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
String ZipRegex = @"^\d{5}$";
if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
{
ResultLabel.Text = "ZIP is valid!";
}
else
{
ResultLabel.Text = "ZIP is invalid!";
}
}
Match
如果在输入字符串中发现匹配,则返回匹配对象。
string input="
";
Regex reg=new Regex(@"
"
;
string output=reg.Match(input).Value;
Matches
如果在输入字符串中发现包含任何或全部匹配,则返回匹配集合对象。
可以使用如下代码遍历输入字符串的匹配集合:
从URL提取协议和端口号
string Extension(string URL)
{
Regex r = new Regex(@"^(?<protol>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.Compiled);
return r.Match(URL).result("${protol}${port}"
;
}
private void MatchButton_Click(object sender, System.EventArgs e)
{
MatchCollection matches = Regex.Matches(SearchStringTextBox.Text,
MatchExpressionTextBox.Text);
MatchCountLabel.Text = matches.Count.ToString();
MatchesLabel.Text = "";
foreach(Match match in matches)
{
MatchesLabel.Text += "Found" + match.ToString() + " at
position " + match.Index + ".<br>";
}
}
Replace
用给定的替换字符串替换输入字符串中的匹配。
可以使用静态 Replace() 方法将匹配替换为特定字符串,如下所示:
String newText = Regex.Replace(inputString, pattern, replacementText);
更改日期格式(用dd-mm-yy的日期形式替代mm/dd/yy的日期形式)
string MDYToDMY(string input)
{
return Regex.Replace(input,@"\b(?<month>\\d{1,2})/(?<day>\\d{1,2}/(?<year>\\d{1,2}\b","${day}-${month}-${year}"
;
}
Split
将输入字符串拆分成用正则表达式匹配分开的数组元素时,返回数组字符串。
除了指定很多方法外,还有一些选项可以指定,通常在 Regex 对象构造函数中。由于这些选项是位屏蔽的一部分,或许可以同时指定这些选项(如,可以同时指定 Multiline 和 Singleline)。
通常,在您需要指定默认方式以外的方式时,需要实例化 Regex 类的实例。特别是在设置选项时。例如,要创建忽略大小写和模式空白区域的 Regex 实例,然后检索与该表达式匹配的集合,则应使用如下代码:
Regex re = new Regex(pattern,
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);
方法 说明
Compiled
当在循环中执行许多匹配操作时使用此选项。这可以节省每一循环的分析表达式步骤。
Multiline
它与输入字符串中的行数没有关系。确切地说,它只修改 ^ 和 $ 的方式,以便匹配行开始 (BOL) 和行结尾 (EOL),而不是匹配整个输入字符串的开始和结尾。
IgnoreCase
使模式在匹配搜索字符串时忽略大小写。
IgnorePatternWhitespace
允许根据需要在模式中包括任意数量的空白区域,也支持使用 (?# 注释 #) 语法在模式中加入注释。
SingleLine
它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除 \n 之外的任意字符(默认情况)。
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm
^符号匹配字符串的开头。
$符号匹配字符串的结尾。
*符号匹配0个或多个前面的字符。
+符号匹配至少一个前面的字符。
?符号匹配0个或1个前面的字符。
.符号匹配除换行符以外的任何字符。
x|y匹配“x”或“y”。
{n}匹配恰好n次(n为非负整数)前面的字符。
{n,}匹配至少n次(n为非负整数)前面的字符。
{m,n}匹配至少m个,至多n个前面的字符。
[xyz]表示一个字符集,匹配括号中字符的其中之一。
[abc] 匹配“a”、“b”和“c”
[^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符。
[a-z]表示某个范围内的字符,匹配指定区间内的任何字符。例如:
[^m-n]表示某个范围之外的字符,匹配不在指定范围内的字符。例如:
\符号是转义操作符。例如:
\n 换行符
\f 分页符
\r 回车
\t 制表符
\v 垂直制表符
\\ 匹配“\”
\/ 匹配“/”
\s 任何白字符,包括空格、制表符、分页符等。等价于“[ \f\n\r\t\v]”
\S 任何非空白的字符。等价于“^\f\n\r\t\v]”
\w 任何单词字符,包括字母和下划线。等价于“[A-Za-z0-9_]”
\W 任何非单词字符。等价于“[^A-Za-z0-9_]”
\b匹配单词的结尾。
\B匹配单词的开头。
\d匹配一个数字字符,等价于[0-9]。
\D匹配一个非数字字符,等价于[^0-9]。
\NUM匹配NUM个(其中NUM为一个正整数),引用回到记住的匹配。例如:
(.)\1 匹配两个连续相同的字符。
\oNUM匹配n(其中n为一个小于256的八进制换码值)。例如:
\o011 匹配制表符
\xNUM匹配NUM(其中NUM为一个小于256的十六进制换码值)。例如:
\x41 匹配字符“A”
"^\d+$" //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$" //正整数
"^((-\d+)|(0+))$" //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$" //负整数
"^-?\d+$" //整数
"^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
"^(-?\d+)(\.\d+)?$" //浮点数
"^[A-Za-z]+$" //由26个英文字母组成的字符串
"^[A-Z]+$" //由26个英文字母的大写组成的字符串
"^[a-z]+$" //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
"^\w+$" //由数字、26个英文字母或者下划线组成的字符串
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url
$number 替换由组号 number(十进制)匹配的最后一个子字符串。
${name} 替换由 (?<name>

$$ 替换单个“$”字符。
$& 替换完全匹配本身的一个副本。
$` 替换匹配前的输入字符串的所有文本。
$' 替换匹配后的输入字符串的所有文本。
$+ 替换最后捕获的组。
$_ 替换整个输入字符串。
分组构造
(

(?<name>

(?<name1-name2>

(?:

(?imnsx-imnsx:


(?=

(?!

(?<=

(?<!

(?>

Regex 类有大量的方法和属性,如果您以前没有用过它,可能会感到无所适从。下面汇总了一些最常用的方法:
方法 说明
Escape / Unescape
字符串中的转义元字符,用作表达式中的文字。
IsMatch
如果正则表达式在输入字符串中发现匹配,返回“Ture”。
例如,下面的函数演示了如何使用正则表达式验证邮政编码:
private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
String ZipRegex = @"^\d{5}$";
if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
{
ResultLabel.Text = "ZIP is valid!";
}
else
{
ResultLabel.Text = "ZIP is invalid!";
}
}
Match
如果在输入字符串中发现匹配,则返回匹配对象。
string input="
|
Regex reg=new Regex(@"
|

string output=reg.Match(input).Value;
Matches
如果在输入字符串中发现包含任何或全部匹配,则返回匹配集合对象。
可以使用如下代码遍历输入字符串的匹配集合:
从URL提取协议和端口号
string Extension(string URL)
{
Regex r = new Regex(@"^(?<protol>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.Compiled);
return r.Match(URL).result("${protol}${port}"

}
private void MatchButton_Click(object sender, System.EventArgs e)
{
MatchCollection matches = Regex.Matches(SearchStringTextBox.Text,
MatchExpressionTextBox.Text);
MatchCountLabel.Text = matches.Count.ToString();
MatchesLabel.Text = "";
foreach(Match match in matches)
{
MatchesLabel.Text += "Found" + match.ToString() + " at
position " + match.Index + ".<br>";
}
}
Replace
用给定的替换字符串替换输入字符串中的匹配。
可以使用静态 Replace() 方法将匹配替换为特定字符串,如下所示:
String newText = Regex.Replace(inputString, pattern, replacementText);
更改日期格式(用dd-mm-yy的日期形式替代mm/dd/yy的日期形式)
string MDYToDMY(string input)
{
return Regex.Replace(input,@"\b(?<month>\\d{1,2})/(?<day>\\d{1,2}/(?<year>\\d{1,2}\b","${day}-${month}-${year}"

}
Split
将输入字符串拆分成用正则表达式匹配分开的数组元素时,返回数组字符串。
除了指定很多方法外,还有一些选项可以指定,通常在 Regex 对象构造函数中。由于这些选项是位屏蔽的一部分,或许可以同时指定这些选项(如,可以同时指定 Multiline 和 Singleline)。
通常,在您需要指定默认方式以外的方式时,需要实例化 Regex 类的实例。特别是在设置选项时。例如,要创建忽略大小写和模式空白区域的 Regex 实例,然后检索与该表达式匹配的集合,则应使用如下代码:
Regex re = new Regex(pattern,
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);
方法 说明
Compiled
当在循环中执行许多匹配操作时使用此选项。这可以节省每一循环的分析表达式步骤。
Multiline
它与输入字符串中的行数没有关系。确切地说,它只修改 ^ 和 $ 的方式,以便匹配行开始 (BOL) 和行结尾 (EOL),而不是匹配整个输入字符串的开始和结尾。
IgnoreCase
使模式在匹配搜索字符串时忽略大小写。
IgnorePatternWhitespace
允许根据需要在模式中包括任意数量的空白区域,也支持使用 (?# 注释 #) 语法在模式中加入注释。
SingleLine
它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除 \n 之外的任意字符(默认情况)。
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm