C#正则表达式的零宽断言

问题描述如下:我有一系列点号,如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:测量解决方案提供者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值