正则表达式学习。
文章目录
1. 正则表达式介绍
1. 什么是正则表达式
英文Regular Expression,是计算机科学的一种概念,它使用一种数学算法来解决计算机程序中的文件检索、匹配等问题。正则表达式语言是一种专门用于字符串处理的语言。在很多语言中都提供了对它的支持,C#也不例外,它可以帮我们解决下面的问题:
- 检索:通过正则表达式,从字符串中获取到我们想要的部分。
- 匹配:判断给定的字符串是否符合正则表达式的过滤逻辑,可以认为正则表达式书写了一个字符串的书写规则。
例如:判断用户输入的密码是否合法。判断用户输入的邮箱格式是否合法。
2. 正则表达式的组成
正则表达式就是由普通字符以及特殊字符(成为元字符)组成的文字模式。该模式描述在查找文字主体时待批匹配时的一个或者多个字符串。
3. 常用的操作正则表达式的方法和委托
下面学习一下位于System.Text.RegularExpressions下的类Regex类的一些静态方法和委托
1. IsMatch方法
静态方法IsMatch(返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式相匹配,它有3个重载方法)
public static bool IsMatch(string input, string pattern)
参数:input:要搜索匹配项的字符串;
pattern:要匹配的正则表达式模式;
返回结果:如果正则表达式找到匹配项,则为true;否则为false。
public static bool IsMatch(string input, string pattern, RegexOptions options)
参数:input:要搜索匹配项的字符串;
pattern:要匹配的正则表达式模式;
options:枚举值的一个按位组合,这些枚举值提供匹配选项。
返回结果:如果正则表达式找到匹配项,则为true;否则 为false。
public static bool IsMatch(string input, string pattern, RegexOptions options, TimeSpan matchTimeout)
参数:input:要搜索匹配项的字符串;
pattern:要匹配的正则表达式模式;
options:枚举值的一个按位组合,这些枚举值提供匹配选项。
matchTimeout:超时间隔
返回结果:如果正则表达式找到匹配项,则为true;否则为false。
2. Match方法
静态方法Match,使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。返回一个包含有关匹配的信息的对象。同样有三个重载方法,参数和IsMatch方法相同。
public static Match Match(string input, string pattern, RegexOptions options);
public static Match Match(string input, string pattern);
public static Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
此外,在Regex类中,还有一个同名的非静态方法,适用于多个实例的情况下,效率更高一些。
public Regex(string pattern);
public Regex(string pattern, RegexOptions options);
public Regex(string pattern, RegexOptions options, TimeSpan matchTimeout);
3. Matches方法
静态方法Matches,在指定的输入字符串中搜索指定的正则表达式的所有匹配项,他同样也有3个重载方法,并且参数和Match方法完全相同。
public static MatchCollection Matches(string input, string pattern);
public static MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
public static MatchCollection Matches(string input, string pattern, RegexOptions options);
4. Replace方法
正则表达式主要是实现验证,提取,分割,替换字符的功能,Replace方法是实现替换功能的。
public static string Replace(string input, string pattern, string replacement)
参数:input是源字符串,
pattern是匹配的条件,
replacement是替换的内容,就是把匹配的条件pattern的内容转换成它。
比如,string result = Regex.Replace("abc", "ab", "##");
结果就是##c,就是把字符串中的ab替换成##
public static string Replace(string input, string pattern, string replacement, RegexOptions options)
参数:RegexOptions是一个枚举类型,用来做一些设定。
//前面用注释时就用到了 RegexOptions.IgnorePatternWhitespace.如果在匹配时忽略大小写就可以用 RegexOptions.IgnoreCase
比如,string result=Regex.Replace("ABc","ab","##",RegexOptions.IgnoreCase);
如果是简单的替换用上面2个函数就可以实现了,但是如果有些复杂的替换,比如匹配到很多内容,不同的内容要替换成不同的字符,就需要用到下面两个函数。
5. Spilt方法
静态方法Spilt拆分文本:使用正则表达式匹配的位置,将文本拆分为一个字符串数组,同样有三个重载方法,返回值为字符串数组。
public static string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout)
public static string[] Split(string input, string pattern, RegexOptions options)
public static string[] Split(string input, string pattern)
6. @符号
@符号:我们经常在正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符,而是作为正则表达式的语法(元字符)存在。
例如,string s=@"www.baidu.com\cn lkjsdflkj";
2. 定位元字符
我们经常在正则表达式前面加上@字符,这样不让编译器去解析其中的转义字符,而作为正则表达式的语法(元字符)存在。
字符 说明
\b 匹配单词的开始或结束
\B 匹配非单词的开始或者结束
^ 用来匹配一个字符串的开始
$ 用来匹配一个字符串的结束
\A 指定匹配必须出现在字符串的开头(忽略Multine选项)
\Z 指定匹配必须出现在字符串的结尾(忽略Multine选项)
\G 指定匹配必须出现在上一个匹配结束的的地方。与Match.NextMatch()一起使用时,此断言确保所有的匹配都是连续的。
示例一:匹配开始^和匹配结束$
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s = "I am a blue cat";
string result1= Regex.Replace(s, "^", "开始:"); //搜索字符串,符合正则表达式的情况,然后把所有符合的位置,替换成后面的字符串
Console.WriteLine(result1);
string result2 = Regex.Replace(s, "$", "结束!");
Console.WriteLine(result2);
Console.ReadKey();
}
}
}
输出结果:
开始:I am a blue cat
I am a blue cat结束!
3. 基本语法元字符
字符 说明
. 匹配除换行符以外所有的任意字符
\w 匹配大小写字母、0-9的数字、下划线_、汉字
\W \w的补集(除"大小写字母、0-9的数字、下划线_、汉字"之外)
\s 匹配任意空白符(包括换行符/n、回车符\r、制表符\t、垂直制表符\v、换页符\f)
\S \s的补集(除"换行符/n、回车符\r、制表符\t、垂直制表符\v、换页符\f"之外)
\d 匹配数字(0~9)
\D 表示\d的补集(除0~9数字之外)
在正则表达式之外,\是转义字符,*是元字符,如果要表示一个.*字符的话,需要使用\ . *
示例一:校验只允许输入数字
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
//正则表达式,数字字符串(任何一个纯数字组成的字符串都与该正则表达式相匹配)
// ^代表匹配字符串的开始位置,\d代表数字,*代表0个或多个字符,$代表匹配字符串的结束位置
string pattren = @"^\d*$";
bool isNumberString= Regex.IsMatch(s,pattren);
Console.WriteLine(isNumberString);
Console.ReadKey();
}
}
}
程序运行结果:
123456
True
哦23456
False
23456w
False
示例二:校验只允许输入除大小写字母、0~9的数字、下划线_以外的任何字符
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
//正则表达式,匹配只包含“大小写字母、0-9的数字、下划线_、汉字”的字符串
// ^代表匹配字符串的开始位置,\w代表匹配大小写字母、0-9的数字、下划线_、汉字,*代表0个或多个字符,$代表匹配字符串的结束位置
string pattren = @"^\w*$";
bool isNumberString= Regex.IsMatch(s,pattren);
Console.WriteLine(isNumberString);
Console.ReadKey();
}
}
}
你好123xiaohe
True
123qwerty&
False
4. 反义字符
字符 说明
\W \w的补集(除"大小写字母、0-9的数字、下划线_、汉字"之外)
\S \s的补集(除"换行符/n、回车符\r、制表符\t、垂直制表符\v、换页符\f"之外)
\D 表示\d的补集(除0~9数字之外)
\B 匹配不是单词开头或结束的位置
[ab] 匹配中括号中的字符
[a-c] a字符到c字符之间是字符
[^x] 匹配除了x以外的任意字符
[^adwz]匹配除了adwz这几个字符以外的任意字符
示例一:匹配除ahou这4个字符以外的所有字符
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string str = "I am a Cat!";
string pattern = @"[^ahou]";//匹配除了ahou这4个字符以外的所有字符
string result1= Regex.Replace(str, pattern, "*");
Console.WriteLine(result1);
}
}
}
运行结果:
**a**a**a**
5.重复描述字符
字符 说明
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或者多余n次
{n,m} 匹配前面的字符n到m次
? 重复零次或一次
+ 重复一次或多次
* 重复0次或更多次
示例一:检验用户输入的内容是否为合法的QQ号码(备注:QQ号码为5~12位数字)
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string qqNumber01 = "234234";
string qqNumber02 = "234234234234234234";
string qqNumber03 = "d4234234234";
string pattern = @"^\d{5,12}$";
Console.WriteLine(Regex.IsMatch(qqNumber01,pattern));
Console.WriteLine(Regex.IsMatch(qqNumber02,pattern));
Console.WriteLine(Regex.IsMatch(qqNumber03,pattern));
}
}
}
运行结果:
True
False
False
6.择一匹配
字符 说明
| 将两个匹配条件进行逻辑"或"(Or)运算。
示例一:匹配一个字符串中的所有数字或字符
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s1 = "34((*&sdflkj 路口的设计费";
string pattern = @"\d|[a-z]";//匹配数字或字符
MatchCollection col =Regex.Matches(s1, pattern);
foreach (Match m in col)
{
Console.WriteLine(m);
}
Console.ReadKey();
}
}
}
运行结果:
3
4
s
d
f
l
k
j
示例二:
将人名输出
方法一:
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s = "zhangsan;lisi;wangwu;zhaoliu";
string pattern = @"[;,.]";//匹配:,.这3个字符任意一个字符
var res= Regex.Split(s, pattern);
foreach(var item in res)
{
Console.WriteLine(item);
}
}
}
}
运行结果:
zhangsan
lisi
wangwu
zhaoliu
方法二(使用则一匹配):
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string s = "zhangsan;lisi;wangwu;zhaoliu";
string pattern = @"[:]|[;]|[.]";//匹配:,.这3个字符任意一个字符
var res= Regex.Split(s, pattern);
foreach(var item in res)
{
Console.WriteLine(item);
}
}
}
}
zhangsan
lisi
wangwu
zhaoliu
示例三:检验国内电话号码(支持三种写法校验 A.010-87654321 B.(010)87654321 C.01087654321 D.010 87654321)
using System.Text.RegularExpressions;
namespace _002正则表达式
{
internal class Program
{
static void Main(string[] args)
{
string telePhoneNumber01 = "(010)87654321";
string telePhoneNumber02 = "010-87654321";
string telePhoneNumber03 = "01087654321";
string telePhoneNumber04 = "09127654321";
string telePhoneNumber05 = "010)87654321";
string telePhoneNumber06 = "(01087654321";
string telePhoneNumber07 = "91287654321";
string pattern=@"\(0\d{2,3}\)[-]?\d{7,8}|^0\d{2,3}[-]?\d{7,8}$";
Console.WriteLine(Regex.IsMatch(telePhoneNumber01,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber02,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber03,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber04,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber05,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber06,pattern));
Console.WriteLine(Regex.IsMatch(telePhoneNumber07,pattern));
}
}
}
运行结果:
True
True
True
True
False
False
False