《正则指引》的一个勘误

本文纠正《正则指引》中14页例1-20的错误,指出书中.NET示例的正确性,并解析Match和IsMatch函数的参数。通过实例代码验证了正则表达式的匹配行为,鼓励读者在学习正则时深入理解每个细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在钻研于晟大师写的《正则指引》,发现里面有不少错误,当然后续也出了一个勘误表提供读者下载来对照(文末会给大家提供勘误文档)
我这里需要纠正的一个错误是在书的14页的例1-20,虽然勘误表中已经纠正这个地方的一个错误,但是按照书中.net的例子,例子的结果是正确的,java的例子未验证,学习java的同学可以验证一下

例子需要解决的问题:
这里写图片描述

例子截图如下:
这里写图片描述

现在我们来验证一下.NET的例子
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication_Regex
{
    class Program
    {
        static void Main(string[] args)
        {
           Match result= Regex.Match("^[a-z-[aeiou]]&","a");
            bool resultBool = Regex.IsMatch("^[a-z-[aeiou]]&", "a");
            Console.WriteLine(result);
            Console.WriteLine(resultBool);
            Console.ReadKey();
        }
    }
}

结果截图:
这里写图片描述

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication_Regex
{
    class Program
    {
        static void Main(string[] args)
        {
           Match result= Regex.Match("^[a-z-[aeiou]]&","b");
            bool resultBool = Regex.IsMatch("^[a-z-[aeiou]]&", "b");
            Console.WriteLine(result);
            Console.WriteLine(resultBool);
            Console.ReadKey();
        }
    }
}

结果截图:
这里写图片描述

可以看出书中的例子的结果是正确的,那么问题出在哪里呢?我们来看一下Regex类Match和IsMatch函数的参数注释
这里写图片描述
这里写图片描述
我们可以看到,Match和IsMatch函数的第一个参数是input(输入,即匹配的字符串),第二参数是pattern(模式,即正则表达式)

接下来分析一下:
Match result= Regex.Match(“^[a-z-[aeiou]]&”,”a”);
实现的是在”^[a-z-[aeiou]]&”字符串匹配”a”字符,匹配到a

Match result= Regex.Match(“^[a-z-[aeiou]]&”,”b”);
实现的是在”^[a-z-[aeiou]]&”字符串匹配”b”字符,匹配为空

我们使用正确的代码来验证一下:

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication_Regex
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("匹配a:");
            Match result_a= Regex.Match("a", "[a-z-[aeiou]]");
            bool resultBool_a = Regex.IsMatch("a", "[a-z-[aeiou]]");
            Console.WriteLine(result_a);
            Console.WriteLine(resultBool_a);

            Console.WriteLine("匹配b:");
            Match result_b = Regex.Match("b", "[a-z-[aeiou]]");
            bool resultBool_b = Regex.IsMatch("b", "[a-z-[aeiou]]");
            Console.WriteLine(result_b);
            Console.WriteLine(resultBool_b);

            Console.WriteLine("匹配1:");
            Match result_1 = Regex.Match("1", "[a-z-[aeiou]]");
            bool resultBool_1 = Regex.IsMatch("1", "[a-z-[aeiou]]");
            Console.WriteLine(result_1);
            Console.WriteLine(resultBool_1);

            Console.ReadKey();
        }
    }
}

调试结果:
这里写图片描述

输出结果:
这里写图片描述

总结:
谢谢大家能坚持读完我的文章,再次表示衷心的感谢,一个小小的问题用了那么长的文章来分析。最近我也在学习正则表达式,正则说简单也简单,说复杂也很复杂,希望学习正则的小伙伴们能够坚持下去,遇到难题的时候我们可以不退缩,仔细分析每一个细节来发现问题的所在。于晟大师的《正则指引》是一本非常好的正则入门书籍,对于书中的错误我们不能要求太高,因为每本书都是经过多次勘误再版才越发完美,可以对应文末晟大师整理的勘误表来阅读本书,谢谢大家的支持

勘误表下载地址:
http://www.luanxiang.org/blog/wp-content/uploads/RE_YAG_Errata.xls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值