最近在钻研于晟大师写的《正则指引》,发现里面有不少错误,当然后续也出了一个勘误表提供读者下载来对照(文末会给大家提供勘误文档)
我这里需要纠正的一个错误是在书的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