ccccccc

tylyj 2011-04-19 11:43:39
博客地址:blog.csdn.net/cj205
本文所有内容对编译原理有一定基础者没有任何意义!

而所谓的单元是我假想的一个()括起来的一个整体单位,你可以理解成运算符的优先级,其实就是这个意思,只是这个概念被弱化了。

很多情况下,我们都忽略了一些细节的知识点,今天冷静下来分析一个正则问题的时候,找到了一个小bug

(?!<a).*

对环视有点基础的一定能看出来这在干什么,也很容易看出来错误在什么地方。

(?:(?!<a).)*

这说明了一个小的单元概念,即 [元字符或普通字符] 加上 [量词] 组成一个单元。也就是说第一个正则中,这个环视作用范围是 .* 而非 .

正则表达式中的范围问题一直都是学习正则和理解(看)正则的一个问题,这对初学者来说必然有所感触。

比如,^a|b$

这样的正则简单是说被|一次性划开了,因此这个正则的含义是 ^a b$ 而非 ^ a|b $这样的结构。你可以想象成( (^a) | (b$) )

这里的小括号是我用来解释的假象单元

这样的单元还有如下情况下

[abcd]|[abcd][abcd]|[abcd]



([abcd]|[abcd])([abcd]|[abcd])

明显就有不同的意思

这个很容易理解,为什么呢,因为我用括号括起来了。但是前面2个情况却没有

第一个情况是, [元字符或普通字符] 加上 [量词]

第二个情况是,整个正则表达式就是一个单元,在这个大的单元里 | 的作用域是所谓“全局作用域”

在这里提醒一点,环视的作用范围是下个正则单元,而不是字符单元。即我一开始抛出的问题

那么(?!<a>)(<[^>]*>)+的环视作用域在哪呢,或者是正则单元是哪个呢。

看下面的例题


string str = "<a><t><t><a><a><a><t><t><t><t><t><a>";
Regex reg = new Regex("(?!<a>)(<[^>]*>)+");
Console.WriteLine(reg.Match(str));

output:<t><t><a><a><a><t><t><t><t><t><a>

现在你明白了正则单元是什么了对吧。好吧,再加上一条 [正则单元] + 量词 还是一个正则单元

我的基础能力我很清楚,所以用编译原理来解释十分吃力,虽然自己能够理顺,但是真的不敢写出来,很期待 过客 续写这么一篇。他的博客和正则看起来都是那么的舒服。绝不拍马溜须,大家都懂的

其实本来这东西,简单而且没什么可说的,作为一个及其微不足道的知识点,抛出这个砖来实在有点过意不去,不过这2天同事抱怨正则难读时我连续发现几个由此造成的困难,加上今天晚上这事(别笑我哈),还是记下来比较好。至于发到这里来,一方面是为了散分,最近一段时间打算升星故此可能开始恬不知耻的抢分(不过也没多少时间回帖哈哈哈),另一方面是真的很希望过客更新博客了,到他版块来骚扰下子
...全文
79 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
朕赐你肥皂 2011-04-20
  • 打赏
  • 举报
回复
别紧张,慢慢说
lanqiang456 2011-04-20
  • 打赏
  • 举报
回复
虽然不知道楼主在说什么但是还是觉得楼主很牛逼
  • 打赏
  • 举报
回复
嗯 结贴
东莞寻香苑 2011-04-20
  • 打赏
  • 举报
回复
呵呵,这样
swalp 2011-04-20
  • 打赏
  • 举报
回复
结了吧。

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧