- 论坛徽章:
- 2
|
回复 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等支持两种模式的语言中,用得好,肯定是会对运行性能提升有帮助的~~~
|
|