免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4019 | 回复: 17
打印 上一主题 下一主题

正则表达式算法悬赏 1000分 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-29 20:07 |只看该作者 |倒序浏览
30可用积分
本帖最后由 Perlvim 于 2012-12-29 20:10 编辑

有创意的代码均会被转账1000积分

要求:实现 ^ $ * 的功能:

先发布一段 C 实现的代码:
  1. /* match */
  2. int match(char *regexp, char *text) {
  3.     if (regexp[0] == '^') {
  4.         return matchhere(regexp+1, text);
  5.     }
  6.     do {
  7.         if (matchere(regexp, text)) {
  8.             return 1;
  9.         }
  10.     } while (*text++ != '\0');
  11.     return 0;
  12. }

  13. /* mtchhere: */
  14. int matchhere(char *regexp, char *text) {
  15.     if (regexp[0] == '\0') {
  16.         return 1;
  17.     }
  18.     if (regexp[1] == '*') {
  19.         return matchstar(regexp[0], regexp+2, text);
  20.     }
  21.     if (regexp[0] == "$" && regexp[1] == '\0') {
  22.         return *text == '\0';
  23.     }
  24.     if (*text != '\0' && regexp[1] == '\0') {
  25.         return matchhere(regexp+1, text+1);
  26.     }
  27.     return 0;
  28. }

  29. int matchstar(int c, char *regexp, char *text) {
  30.     do {
  31.         if matchhere(regexp, text) {
  32.             return 1;
  33.         } while (*text != '\0' && (*text++ == c || c == '.'));
  34.         return 0;
  35.     }
  36. }
复制代码
以上代码抄自《代码之美》

我正尝试用Perl实现一个具有基本正则能力的匹配算法。稍后会发布上来。可能超过 500 行

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2012-12-29 22:02 |只看该作者
perl内置了 正则, 你再重新来搞一下, 何必呢?

论坛徽章:
0
3 [报告]
发表于 2012-12-30 08:11 |只看该作者
只是学习一下而已

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2012-12-30 15:02 |只看该作者
围观答案。。。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
5 [报告]
发表于 2012-12-30 21:20 |只看该作者
不懂楼主什么意思。

论坛徽章:
0
6 [报告]
发表于 2012-12-31 08:49 |只看该作者
本帖最后由 Perlvim 于 2012-12-31 08:50 编辑

正则表达式虽然是一种广泛存在于各种编程语言中的一种基本能力,但实现各不相同,功能也有强有弱,还有一些语言,没有正则的扩展,例如asm, Lua的正则库非常简单。

许多基础的算法,都大量的使用正则匹配功能,如果有明白简单的实现算法,那么就可以在一些没有正则算法环境中快速建立这种能力。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2012-12-31 09:39 |只看该作者
《精通正则表达式》里面应该有C代码吧,写个 Perl 版的练手应该很不错。

论坛徽章:
0
8 [报告]
发表于 2012-12-31 10:53 |只看该作者
没有找到代码实现,主要是原理性阐述。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
9 [报告]
发表于 2012-12-31 11:46 |只看该作者
也可以去读读 Perl 6 的正则是怎么实现的,这个肯定比 C 语言的代码实现读起来容易多了。Perl 6 的正则除了 rakudo/nqp 里的实现外还有 masak 的 gge 是用纯 Perl 6 写的 Perl 6 grammar engine,只是 gge 好像有两年没更新了,不知道它的实现到什么程度了,但是我相信它对一般的正则支持肯定是有了。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
10 [报告]
发表于 2012-12-31 18:46 |只看该作者
Perlvim 发表于 2012-12-31 08:49
正则表达式虽然是一种广泛存在于各种编程语言中的一种基本能力,但实现各不相同,功能也有强有弱,还有一些语言,没有正则的扩展,例如asm, Lua的正则库非常简单。

许多基础的算法,都大量的使用正则匹配功能,如果有明白简单的实现算法,那么就可以在一些没有正则算法环境中快速建立这种能力。

这是完全没有必要的,因为大多数语言都支持 C 库的链接,而 C 有一个著名的 PCRE 库实现的就是 Perl 5 兼容的正则表达式,比如 R 语言直接支持好几种正则表达式引擎,其中有一个就是对 PCRE 的封装。你举的例子里的 Lua,其语言本身就有一个相当显著的特性,就是极易与 C 交互,因此即使你不喜欢 Lua 提供的正则表达式,也不喜欢 Lua 强大的 lpeg 库的话,你仍旧可以对 PCRE 的 C 库进行封装,而且我相信这样的封装甚至其实已经存在了。而且近来的趋势是尽量不使用正则表达式,因为正则表达式用于小问题还行,用于稍微复杂一点的问题就显示出了它本身的 ugly,所以 Lua 才有了 lpeg,很多其它语言也有了 peg 的实现,除了 Lua 外还有C, Ruby 等,Perl 6 也借鉴 Haskell 的 Parserc 模块而提供了 Grammar 解析的功能。而且,虽然 Haskell 提供了很多语法解析用的模块,仍旧也有正则表达式模块对 C 的 PCRE 库进行封装。要自己临时写一个功能完整,又效率可以接受的正则表达式引擎还是得花不少时间的,所以个人认为如果不是为了研究正则表达式的实现并对它进行扩展或者纯粹只是为了好玩(或者向别人炫耀)之类的就完全没有自己写的必要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP