免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
64 [报告]
发表于 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等支持两种模式的语言中,用得好,肯定是会对运行性能提升有帮助的~~~


论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
63 [报告]
发表于 2012-06-04 20:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
62 [报告]
发表于 2012-06-04 18:57 |只看该作者
send_linux 发表于 2012-05-31 21:59
谢谢参与哈,对啊,做为运维管理工作中,需要大量用到的脚本啥的,正则表达式是必不可少的吧,呵呵



正则是必不可少的啊!

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
61 [报告]
发表于 2012-06-04 18:54 |只看该作者
本帖最后由 milujite 于 2012-06-04 18:55 编辑

本期话题:
1、在你的日常工作中会使用正则表达式解决什么样的问题?
2、正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者?

1、文本过滤,我常用的文本编辑器是NOTEPAD++和VIM,NOTEPAD++的正则跟VIM还是没得比的。如经常要过滤掉配置文件里#开头的,就":g/^#/d",查找些匹配字段之类的。
2、日志分析过滤,形成报表,以前维护过MAIL服务器,邮件头是包含各种各样信息的,因此要获取这些信息用于统计,还得靠正则。学习了PERL和PYTHON,实现同样的功能,PERL和Python的正则匹配比shell脚本快好多,特别是大量日志要获取某些值用于分析。PERL的正则引擎个人觉得是几门常用脚本语言里最效率的,虽然现在很多人都已经用PYTHON去取代PERL了。PCRE语法和GREP之类的正则语法还是有一定区别的,经常会用混乱了。所以用GREP之类的干脆直接加-e。

论坛徽章:
0
60 [报告]
发表于 2012-06-04 18:33 |只看该作者
正则小白围观,学习!

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
59 [报告]
发表于 2012-06-04 16:42 |只看该作者

论坛徽章:
0
58 [报告]
发表于 2012-06-04 14:34 |只看该作者
本帖最后由 wallcopper 于 2012-06-04 14:39 编辑

1、天天用vi,会逐渐理解正则表达式的字符,^$\等等 ?
以前真不明白\/和\\是啥意思。为不知道替换?或&特殊字符发愁。sed -i 's@\?tid=@\&tid=@g'  
2、grep,sed,awk等命令用得越多,接触正则表达式也越多, ls  -l|grep ^d
3、apache和nginx配置多了,老和正则打交道
      if ($host = 'abc.com' ) {
                rewrite  ^/(.*)$  http://www.abc.com/$1  permanent;
        }
4、发现perl,bash,php,java,c,python,js,jsp等也老用到正则表达式
5、发现oracle语句中也用到正则
6、以前看sendmail.cf老看不明白大串的奇怪字符组合,后来才知道原来sendmail和Postfix都支持正则表达式
7、以前看人家写的包含正则表达式的脚本,真是难懂,慢慢理解了才知道,原来都用得是正则表达式啊。

论坛徽章:
0
57 [报告]
发表于 2012-06-04 14:01 |只看该作者
搬个板凳坐下,坐等高手。呵呵

论坛徽章:
0
56 [报告]
发表于 2012-06-04 12:14 |只看该作者
回复 52# Shell_HAT


    很难说cat’是cat 和一个撇号( '),还是cat 后接单引号。这可能是计算机还不能接管世界的一个原因?

这个解释我好喜欢~~~

论坛徽章:
0
55 [报告]
发表于 2012-06-04 12:11 |只看该作者
大学期间学的C,工作后直接上perl,正则表达式用的那叫一个爽。前几天做linux一些应用开发的时候又用到C,如何匹配字符串?char str_src[128], str_dest[4]; strncp();strcmp()...曾经沧海难为水,感觉好凄凉。。。
问:C里有类似正则的做法吗?或者有谁手头有类似正则的函数不?
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP