R016.科普.正则表达式及文本编辑
不等不靠,有囧有料。终日乾乾,或跃在渊。
正则表达式(RegExp),是攻城狮标配技能,
本期视频,让各位狮友40分钟从精通到入门 :)
@史荣久 / 2015-05-27 / CC-BY-SA-3.0
观看视频
内容摘要
■ 文本加工的例子(验证,提取,替换,分割):
- 12个月
(1[012]|[1-9])
,千分位数\d{1,3}(,\d{3})*
。 - CSV文件(标准格式)的域
([^",]+|"(?:[^"]|"")+")
。 - 只正则,根据SQL生成JavaBean,带注释和注解。
- 不编码,统计spring-framework源码,达到以下目标:
- 一共有多少个开发者(distinct @author)?
- 每个开发者参与了多少行代码(粗略,有author就算)?
■ 正则表达式精要(基本上NFA各流派都适用):
- 两大流派:PCRE(Perl兼容),Posix(BRE和ERE)。
- 12+元字符
^$?+*.\{[(|)
,2+特殊字符\^
+[-]
。 - 2种选择结构:字符串
(X|Y|Z)
,字符[xyz]
及否定[^xyz]
。 - 字符串多选结构的否定式,需要用环视(零宽断言)
(?!X|Y|Z)
。 - 常用的字符组
dwsb
,\p{punct}
,块转义\Q\E
(QuotE)。 - 捕获组,反向引用,贪婪,非贪婪,量词,边界等。
.
不能匹配换行符,小技巧[\s\S]*
,[\d\D]*
。- CRLF:
[\r\n]+
,\r?\n
(记忆:return,n-r:a-d)。 - java的String.replaceAll,split要注意转义。
- java的replace时候,要注意替换字符串中的
$
。 - java的
\1
和$1
,\k<name>
和${name}
的用法。。 - java的命名组,反向引用,超过9个引用时。
■ 文本加工的命令(Unix哲学,组合,精专):
- 最牛的linux命令
alias cd='rm -rf'
,玩笑加姿势。 - 本期命令:
grep
,find
,xargs
,sed
,uniq
,wc
。 ag
超快的文本搜索命令,在700M代码用表达式不到3秒。- linux下,各种转义的规律(ERE,双引号,单引号)。
- MS Window移植:
Cygwin
,GnuWin32
,unxutils
参考资源
■ 正则参考资料(括号内,为推荐程度):
- RegExp CheatSheet
- CSDN 雁过无痕博客(强力推荐)
- 《精通正则表达式 (第3版)》(一般了解)
- 《正则表达式经典实例》(一般了解)
- 教学网站(例解语言差异)(随用随查)
- Sublime 3 Docs PCRE
- Java 8 Pattern API
- java 命名分组的引用
- js RegExp资料 - w3school
- js RegExp资料 - mozilla
■ 命令参考资料(应该记住,或者经常man):
- 你见过的最牛逼的命令行程序是什么?
sed -E
扩展正则表达式sed
基本正则表达式bash
单双引号与转义bash
单双引号与转义(需科学上网)ag
很快的文本搜索awk
做sql的sum
,group
■ 其他参考资料(Win32移植很犀利,RFC不是KFC):
欢迎围观
if (you.accept(MoilionCircle.SPIRIT)) {
if(you.haveADL()){
MoilionCircle we = you.search(MoilionCircle.SLOGAN);
we.welcome(you);
}
if(you.share(this)){
We.thank(you);
We.mayFind7Moilion();
}
}
我的收获
是时候显摆一下,每期视频,我的个人收获了。
速读了《精通正则表达式 (第3版)》和正则表达式经典实例》,
比较系统的了解了Regexp,原理和如何写出高性能的Regexp。
同时一直不太清楚的环视,贪婪,占有,也一并彻底吃透。
此外,更新了CSV标准定义,和bash转义中单双引号。
还有posfix的BRE和ERE的区别,之前老搞不清楚,主要靠试。
关于正则就说这么些吧。
题图:正则表达式,古老的智慧,多用作文本验证和加工。它看起来迷糊,学起来简单,用起来神奇。