C#正则表达式的零宽断言
2016-07-06 11:03
375 查看
问题描述如下:我有一系列点号,如C120、C121、C122。首先我想判断这个点号是不是(字母开头,后面加数字)的形式。如果是,我想把字母提取出来。
第一个要求用前面的文章中的东西很容易就达到了,代码如下:
static void Main(string[] args)
{
string ss = "C0";
string pattern = "[A-Za-z]+(?=[0-9])";
Match matResult = Regex.Match(ss,pattern);
if (!matResult.Success)
{
Console.WriteLine("err");
}
else {
Console.WriteLine("ok");
}
Console.Read();
}
但是现在的匹配结果是像C120这样的整个的符串,并达不到自己想提取前面C的要求。
要解决这个问题,就要用到零宽断言。零宽断言的意思是:匹配宽度为零,满足一定的条件/断言。用这个例子来说就是要求字母后面是数字,但不匹配(匹配宽度为零)后面的数字。
最常用的断言有两种,分别是先行断言和后行断言。
先行断言的意思是匹配部分在前面,然后后面加断言。表达形式为(?=exp)。这个正好适用于现在这个情况。先给出表达式\b[a-zA-Z]+(?=[0-9]+\b)。在括号之前的就是C#正则表达式的应用中说明的内容,这里不再多说。括号里面就是先行断言。表示前面先是字母,后面以数字结尾,但不匹配数字。如果对C120使用这个表达式则匹配C
后行断言意思恰好和先行断言相反。类似于上面那个问题,如果我们想匹配C120中的120,则表达式为(?<=\b[a-zA-Z]+)[0-9]+\b。技术细节不再多说。
断言其实还有其他的种类,这里没有用到,暂时不多说。
转载自TsonTec:测量解决方案提供者
第一个要求用前面的文章中的东西很容易就达到了,代码如下:
static void Main(string[] args)
{
string ss = "C0";
string pattern = "[A-Za-z]+(?=[0-9])";
Match matResult = Regex.Match(ss,pattern);
if (!matResult.Success)
{
Console.WriteLine("err");
}
else {
Console.WriteLine("ok");
}
Console.Read();
}
但是现在的匹配结果是像C120这样的整个的符串,并达不到自己想提取前面C的要求。
要解决这个问题,就要用到零宽断言。零宽断言的意思是:匹配宽度为零,满足一定的条件/断言。用这个例子来说就是要求字母后面是数字,但不匹配(匹配宽度为零)后面的数字。
最常用的断言有两种,分别是先行断言和后行断言。
先行断言的意思是匹配部分在前面,然后后面加断言。表达形式为(?=exp)。这个正好适用于现在这个情况。先给出表达式\b[a-zA-Z]+(?=[0-9]+\b)。在括号之前的就是C#正则表达式的应用中说明的内容,这里不再多说。括号里面就是先行断言。表示前面先是字母,后面以数字结尾,但不匹配数字。如果对C120使用这个表达式则匹配C
后行断言意思恰好和先行断言相反。类似于上面那个问题,如果我们想匹配C120中的120,则表达式为(?<=\b[a-zA-Z]+)[0-9]+\b。技术细节不再多说。
断言其实还有其他的种类,这里没有用到,暂时不多说。
转载自TsonTec:测量解决方案提供者
相关文章推荐
- ArcGis:vs c#编程遇到问题The specified filename is invalid
- C# 深拷贝的具体代码的封装与调用
- C Sharp里的委托和事件
- c# BackGroundWorker 多线程操作的小例子
- C#中的TabControl控件的选项卡如何隐藏?
- C#文件的压缩和解压(ZIP)使用DotNetZip封装类操作zip文件(创建/读取/更新)实例
- 语法优化-多条件判断
- C# 判断时间格式是否正确,多种判断
- C# 指定模板 并导出Excel
- C# Dictionary 的操作集合
- c#中const与readonly区别
- C#万年历
- C# Refactorings VS插件
- C#之时间统计
- c# ref out 区别 比较 汇总
- pInvokeStackImbalance 调试异常的解决办法。
- C#和C++混合编程
- [C#6] 4-string 插值
- C# byte数组转long型数据
- C#发送邮件源码