免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

正则表达进阶大讨论!欢迎参与讨论!(获奖名单已公布-2012-7-6) [复制链接]

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
61 [报告]
发表于 2012-06-05 00:56 |只看该作者
回复 1# send_linux


在你的日常工作中会使用正则表达式解决什么样的问题?


     Regex主要是用来 写脚本来完成工作中的细节问题, 另外 还用来看DB/OS的日志,过滤日志来得到需要的结果。


正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者


用多了就有感觉的, 讲一些小细节吧~~

1。 要适当了解DFA/NFA不同引擎的工具,对于Regex的解析不同~~这个在之前那本 精通正则表达式里面讲了不少
     DFA的格式不支持回溯, NFA在特定情况下会比较慢。当然现在不少是改进过的NFA~~

2。 要注意不同的平台上 工具的支持度不一样。
    比如grep/egrep命令, 在目前的Linux平台上支持得比较新, 但像在Solaris10上面,仍不支持grep -e(solaris11 已经支持), 需要 egrep来替代

    而像tr命令,在解释下面一条命令时候则会出现不同平台上不同答案(对于括号的解析不同)
    $ echo  '[]' | tr '[a-z]' A

    在一些平台上,不支持'+'匹配,那么匹配空字符需要
    [[:space:]][[:space:]]* 来替代 [[:space:]]+

    下面这段小代码,则在Linux/Solaris上面的运行性能完全不一样。在solaris设备上取随机数再调head,当行数较大时性能明显变差。
    $expr 'NAME'`</dev/urandom tr -dc A-Za-z0-9_#$ | head -c29 |tr '[a-z]' '[A-Z]'`
    所以这段代码我移植到Solaris上面的时候,攺了较多
    并且由于solaris10上面不支持 tr -c命令, 又不得不用sed/strings来完成,由于下面又不能保证结果长度, 不得不做几次paste之后再截字符串
    $expr 'NAME'`sed 's/[^a-zA-Z0-9_$#]//g' /dev/urandom | strings -n 5 | head -1`


3。 一些常用的Regex可以记住~~         
    比如sed删掉只有空字符的行
    $ sed '/^[[:space:]]*$/d'

4。 记得特殊字符或控制字符转义
    比如上面说的[[:space:]]+ 在sed里面,需要把加号转义成 [[:space:]]\+
    还有sed里面的范围控制变量()需要转义,但实际匹配的"("不需要转义
    sed 's/\([[:alpha:]]\)(\([[:alpha:]]\)/\1 \2/g'

5。 一个脚本只做一件事。
    特别是在shell脚本中, 不要尝试一下写很长的匹配串,对于复杂事务,完全可以用多次简单处理来做到的, 提高可读性和可调试性能。
    一下子写一串特别长的Regex匹配串并不一定明智,除非是在已经充分验证或者成熟的大程序方案中,为了性能提升而考虑减少调用次数。

6。 区别贪婪/非贪婪模式(Greediness/Laziness)
    我的想法是,在条件判断,比如判断子字符串是否存在的时候,可以用非贪婪模式来解决。 而不用考虑有1次以上或者多种可能的匹配度。
    在perl等支持两种模式的语言中,用得好,肯定是会对运行性能提升有帮助的~~~


论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
62 [报告]
发表于 2012-06-05 11:37 |只看该作者
回复 55# chenjintao_ii


    pcre~~~~~

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
63 [报告]
发表于 2012-06-05 13:24 |只看该作者
不是很会讲这些东西,觉得经常逛论坛,跟大家讨论问题,帮助解答一些问题,以及看其他人的解法学习经验,慢慢的就会了。经常从别人的解法里学到一些解决问题的新思维,感觉收获很多。

编程这东西理论要看,不能连基本的概念都分不清楚。但所谓纸上得来终觉浅,这个还得靠动手才行。网上有什么单行脚本参考什么的,在拿来用之前有空自己实现一次,看看跟别人写的有什么不一样的地方,找到别人的方法和自己的方法之间的差别,想想为什么,想想不同的方法的区别是怎样的,从而提高自己。

我一直觉得“正则表达式”的发明真是一种对规律的极大的概括和抽象,是一个很完美的概念。

题外话:
我发现我不是很会看“置顶”的帖子,因为每次进论坛上面都是一片置顶的老帖,所以不会去认真看有新贴置顶。可能的一个解决办法就是老的置顶帖用较不鲜艳的颜色,新的则用比较鲜艳的颜色。

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
64 [报告]
发表于 2012-06-05 13:42 |只看该作者
seesea2517 发表于 2012-06-05 13:24
不是很会讲这些东西,觉得经常逛论坛,跟大家讨论问题,帮助解答一些问题,以及看其他人的解法学习经验,慢 ...


收到您的建议了,我们现在也在很快的更新置顶帖了....

论坛徽章:
3
水瓶座
日期:2014-03-25 17:08:042015亚冠之塔什干棉农
日期:2015-08-10 10:45:122015亚冠之萨济拖拉机
日期:2015-08-13 16:05:24
65 [报告]
发表于 2012-06-05 14:23 |只看该作者
学习学习:wink::wink:

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
66 [报告]
发表于 2012-06-05 15:21 |只看该作者
学习正则的后期就是如何处理减少回朔,提高效率

论坛徽章:
0
67 [报告]
发表于 2012-06-05 23:55 |只看该作者
正则好麻烦啊,用不好

论坛徽章:
0
68 [报告]
发表于 2012-06-06 09:45 |只看该作者
回复 10# Shell_HAT

这个个很强大,正则表达式没怎么用过,学习下。。。。


   

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
69 [报告]
发表于 2012-06-08 21:13 |只看该作者
回复 72# 448395708


    学会之后可以提高效率

论坛徽章:
0
70 [报告]
发表于 2012-06-10 22:01 |只看该作者
凑凑热闹,呵呵。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP