本期特邀华南某电商公司技术总监余晟老师,针对正则表达式问题给予解答,欢迎网友积极提问,与专家一起讨论!
专家著作:《正则指引》《精通正则表达式》
查看本期门诊精彩实录:http://doctor.51cto.com/develop-264.html
参与最新技术门诊:Ext JS 4的华丽转身
精选本期网友提问与专家解答,以供网友学习参考。
Q:
余老师您好:
在学习正则表达式的时候,我经常分不清哪一些是 shell中匹配符的用法,因为在正则和匹配符
像 * ^这些俩边都用的。想问一下老师,关于这俩个概念的明确定义是啥?那些时候用到匹配符,那些
时候我用的肯定是正则!
谢谢!
A:
^在Shell中没有特定含义,在正则中指的是一行文本的起始位置;
*在正则表达式中是一个量词,表示之前元素可以不出现,也可以出现任意多次;在Shell中它表示通配
符,表示任意长度的任意文本
Q:
正则表达式,在各个语言中好像稍有不同啊,shell perl python Tcl ,我是常用这四种,每次遇到不
同,看百度,看的头疼,不知道老师有没有总结文档,或者重点的区别在哪?
A:
你好,这个问题的解法在于先弄明白语言中立的概念,然后再了解各个语言具体的规定(比如转义,比
如支持的功能)。具体你可以参考《正则指引》,或者也可以参考http://www.regular-
expressions.info/
Q:
对正则表达式没啥研究,之前做一些文档查询功能的的时候针对文档内容关键字匹配的查询总是不怎么
理想,如果文档内容少点查询效率就还好,如果是查过5M的文档,速度就很慢,特别使用一些通配符的
时候,搜索结果很不理想,不知道对于文本搜索这一块,正则表达式是不是有什么作用?如果要深入学
习正则表达式,从哪些方面入手会比较容易?
A:
可以参考这篇文章:http://www.luanxiang.org/blog/archives/1308.html
在查找大文本的时候,如果使用得当效率是没有影响的,我尝试过处理超过1G的日志文件,2分钟之内可
以完成
Q:
余晟老师您好:我是一名从事娱乐应用软件开发的策划师,本人并非程序员,只是应用程序员封装好的
变量来编写正则表达式,除了数学运算外逻辑运算很少用到,很想提高逻辑运算方面的表达式编写能力
,这样在向程序员提出相关需求时会更有针对性,谢谢
A:
如果是需要锻炼逻辑,可以专门学习数理逻辑或者离散数学。数理逻辑相比通常所说的“逻辑”,更加
严格,更加形式化,难度并不高。
Q:
余老师您好!
在工作中我不用这个,学这个完全是个人兴趣,我会在有空的时候就做一些小工具,来玩儿(主要是用来
分析网页).
因为没有系统的看过这方面的讲解,或者说是书籍吧,主要是看的很流行的一篇叫《正则表达式30分钟入
门教程》的文章,
感觉讲的已经可以了,毕竟这样已经能够完成自己的大部分需求,
在这里主要是想请教一下,
1:为什么正则表达式会效率会比较高?
2:正则用的最多的地方是?
3:对于正则表达式您会推荐的书籍是?
A:
你好。
你的问题都比较大,限于篇幅难以展开,这里简单回答:
1)在进行字符串的模式匹配时,正则表达式的效率很高,因为它背后的原理是自动机。在复杂操作(比
如查找一个email地址,验证一个url地址)时,比单纯的字符串操作函数要高很多。
2)用的多的地方有好几个:数据验证、数据提取、数据修改(替换);
3)我推荐的书籍有《正则指引》和《精通正则表达式》。
Q:
余老师您好!
我做web开发比较多,所以正则表达式用的最多的地方就是js里做表单验证,这些还应付的来,
可许多时候有些问题我没用正则表达式,别的方法同样可以实现,但项目经理就偏要用正则,说灵活性
好等,但这种根据别人的要求来写正则真是有点头疼,所以望老师指点迷津。
A:
你好。
我认为不一定需要使用正则表达式的,只要能完成功能,什么办法都可以。《正则指引》里专门有内容
讲什么时候不应该使用正则表达式。
Q:
余老师:
你好,我最近在学习shell编程,正则表达式与shell之间有关联吗?
因为看shell方面的书籍,正则表达式是单独用一章节来介绍的。
在学习正则表达式方面,有什么快速掌握的窍门?
例如正则表达式当中sed工具的使用,sed -i 's/doc/boc/roo/boo/g' rrr.txt 这一例子,是想将
rrr.txt文本当中的/doc/boc/替换成roo/boo/,我上面的写法肯定不对,需要加反引号,可是我不知道
反引号要怎么加在上例?才能替换成功?
还有反引号主要用在哪些场合呢?能否举几个实例?
A:
Linux/Unix下的Shell会大量用到正则表达式。
学习正则表达式没有什么快速入门的诀窍,关键还是学习一些基础概念和元素的用法,多练习。
你说的sed的问题与反引号无关,因为在sed的命令中,斜线/是作为分隔符(delimeter)来使用的,在
sed /old/new/ 这样的语法规范中,/用来分隔需要替换的参数和要替换成的参数。如果要在参数中使用
/,则应当转义为\/,也就是sed -i 's/doc\/boc/roo\/boo/g' rrr.txt