浏览 2152 次
锁定老帖子 主题:<精通正则表达式>学习笔记(一)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-14
最后修改:2009-08-14
所以现在打算温习下,顺表做个笔记. 打算写一个系列,努力去坚持. 基本按照书本章节来写 start: 第一章 正则表达式入门 作为对程序员来说,一些描述性,摘要性的东西我就不多说了.作为一个笔记类的文章,我大概在里面写一些自己在学习过程中觉得应该注意的,或者比较重点的东西.当然,很多都是自己主观的,大家有意见可以提出. 在这本书中,作者很推崇perl,我看了之后,觉的perl真的是很适合去做正则的一些工作.但是自己perl基本是只是熟悉语法,遗憾...只有慢慢学习了! 进入技术性学习: 1:行的起始和结束 ^ $ 2:字符组 是以[]作为字符组的 比如[ab] 注意:在字符组内部,字符组元字符-表示一个范围 eg:[a-z] 3:排除性字符走 [^ab] 注意:排除型字符组表示"匹配一个未列出的字符",而不是"不要匹配列出的字符" 4:点号匹配任意字符 5:多选结构 ...|...|... 在这里作者提到了多选结构和字符组的一个有点搞的东西,自己在第一次看的时候也被弄忽悠了,作者最后在后面解释: 一个字符组只能匹配目标文本的单个字符,而每个多选结构自身都可能是完整的正则表达式,都可以匹配任意长度的文本. ps:我在后面看到,正则中的条件判断,类似java中的三目运算符,可以模拟多选 6:忽略大小写 这个自己觉的很有用,刚刚入行的时候,想用这个功能,问了很多人,都不知道... 暂时先给出一个egrep的例子,后面仔细描述 egrep -i 'a' abbba (暂时未测试) 7:单词边界 \<(起始) \>(结束) \B \b 8:可选项元素 ? colou?r 这个u可以出现,也可以不出现.出现频率最多出现一次.类似实现方式有colou{0,1}r 9:重复出现 + 一次或多次 至少一次 * 零次或多次 最少零次 10:区间 {min.max} 11:捕获以及反向引用 解释 捕获:一般正则表达式中括号中匹配内容会被捕获,也就是被规则引擎保存 反向引用:对捕获的内容,进行引用 eg:\<([A-Za-z])+\1\> [A-Za-z] 是被捕获内容 \1是对它的反向引用 注:各个语言中的捕获,以及反向引用可能实现方式不同,但是概念是一样的 12:转义 \char 附上java的一个简单代码,对上面的进行简单代码实现. package com.cn; import java.util.regex.Matcher; import java.util.regex.Pattern; class RegularTest { /** * 简单匹配 * * @param testString * 测试字符 * @param regular * 测试正则表达式 */ private static void MarchRegular(final String testString, final String regular) { Pattern pattern = Pattern.compile(regular); Matcher marcher = pattern.matcher(testString); System.out.print(regular + "匹配" + testString + ":"); if (marcher.find()) { System.out.println("OK"); } else { System.out.println("NG"); } } /** * 捕获及反向引用 * * @param testString * 测试字符 * @param regular * 测试正则表达式 */ private static void MarchGroup(final String testString, final String regular) { Pattern pattern = Pattern.compile(regular); Matcher matcher = pattern.matcher(testString); if (matcher.find()) { System.out.print(regular + "匹配" + testString + "OK"); int groupCount = 0; groupCount = matcher.groupCount(); for (int i = 0; i < groupCount; i++) { System.out.print("第" + i + "个捕获值为:" + matcher.group(i + 1)); } } else { System.out.print(regular + "匹配" + testString + "NG"); } } public static void main(String[] args) { /* * ^ $ */ MarchRegular("abb", "^a*b$"); MarchRegular("abbc", "^a*b$"); /* * [ab] * */ MarchRegular("a", "[abc]"); MarchRegular("d", "[abc]"); /* * [^ab] */ MarchRegular("d", "[^abc]"); MarchRegular("a", "[^abc]"); /* * 点号匹配任意字符 */ MarchRegular("a", "."); /* * 多选结构 */ MarchRegular("a", "a|b|bc"); MarchRegular("bc", "a|b|bc"); MarchRegular("bd", "a|b|bc"); MarchRegular("d", "a|b|bc"); /* * 忽略大小写 java中忽略大小写还有另一种写法, * Pattern.compile的第二个参数:Pattern.CASE_INSENSITIVE) * */ MarchRegular("d", "(?i:D)"); MarchRegular("D", "(?i:d)"); /* * 单词边界 \\b 这里\b是对应单词边界 \\b其中对\进行了转义 */ MarchRegular("test", "\\btest\\b"); MarchRegular("tes", "\\btest\\b"); /* * 可选项元素 ? */ MarchRegular("tes", "test?"); MarchRegular("test", "test?"); MarchRegular("tesm", "test?"); /* * + * */ MarchRegular("test", "test+"); MarchRegular("testt", "test+"); MarchRegular("tes", "test+"); MarchRegular("test", "test*"); MarchRegular("testt", "test*"); MarchRegular("tes", "test*"); MarchRegular("tess", "test*"); MarchRegular("tem", "test*"); /* * 区间 */ MarchRegular("m", "m{0,4}"); MarchRegular("mm", "m{0,4}"); MarchRegular("mmm", "m{0,4}"); MarchRegular("mmmm", "m{0,4}"); MarchRegular("mm", "m{3,4}"); /* * 捕获以及反向引用 java中反向引用采用 matcher.group(arg) */ MarchGroup("mmaa", "(m)(a)"); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |