随笔 - 59, 评论 - 580, 引用 - 50

导航

工具

关于


微软提供的免费计数器

山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,唯吾德馨。苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。可以调素琴,阅金经。无丝竹之乱耳,无案牍之劳形。南阳诸葛庐,西蜀子云亭。
子曰∶“何陋之有?”


My name is BEN.
This is my master's "doghouse". hehe...

标签

每月存档

广告



访客

 

假设只接受public/private两个修饰符,并且只接受void/bool/int三个返回类型,接受字段、属性和函数。函数不允许有参数,属性有get/set(为简单起见,先get后set),字段只能是bool/int两个类型(不允许初始化)。函数和属性的内容为空,只有一对花括号。那是不是应该这么写呢?
 
(?(?public|private)\s+(?void|bool|int)\s+(?\w+)\s*\(\s*\){\s*})|(?(?public|private)\s+(?void|bool|int)\s+(?\w+)\s*{\s*get\s*{\s*}\s*set\s*{\s*}\s*})|(?(?public|private)\s+(?bool|int)\s+(?\w+)\s*;)

这么写是对的,但是效率方面却不是很好。对于这个简单的情况可能还是体现不出来,但是如果更加复杂的话,可能就会出现效率低下的问题了。我们应该怎么怎么改呢?

(?(?public|private)\s+(?>(?void)\s+(?\w+)\s*(?>(?\(\s*\)\s*{\s*})|(?{\s*get\s*{\s*}\s*set\s*{\s*}\s*}))|(?bool|int)\s+(?\w+)\s*(?>(?\(\s*\)\s*{\s*})|(?{\s*get\s*{\s*}\s*set\s*{\s*}\s*})|(?;))))

这种写法跟上面那一种写法有什么不一样呢?对于
public int aaaaaaaaaaaaaa;
这一个句子,前面的正则表达式需要尝试function这一组的匹配,在分号位置匹配失败之后退到匹配的开始位置。然后再尝试匹配property这一组,在同一个位置匹配失败,然后回溯到起点,最后才成功匹配variable这一组。换句话说,对于这句话来说,几乎每一个字符都被比较和匹配了三次。如果问题更复杂一点,这样的写法可能就会存在多个地方需要回溯匹配,效率就更低下了。而后面一种写法,在每个地方都是确定的,如果不能够匹配的话,整个匹配就必然失败,而完全不需要回溯。

注意上面所有A|B的关系的地方都会用(?>A|B)的形式来指定,如果匹配成功了,就不会再回溯到原来的地方尝试另外一种可能。在正则表达式里面,总是会尝试最大匹配,如果不使用(?>A|B)的形式的话。这是什么意思呢?

留给大家思考吧。

相关文章

打印 | 张贴于 2004-06-30 12:39:00 | Tag:.NET 技术内幕  其他

留言反馈

#re: 用正则表达式捕获标识符——随便说 编辑
垃圾文章,结果还占搜索引擎前面,
浪费别人时间!!!
2006-02-13 18:43:00 | [匿名用户:浪费别人时间!!!]
#回复: 用正则表达式捕获标识符——随便说 编辑
好复杂,看来自己学得还不够啊
2004-06-30 16:37:00 | [匿名用户:阿赖.COM]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System