• 1. Java正则表达式Brady
  • 2. 内容安排正则表达式概述 Java对正则表达式的支持 Java中使用正则表达式示例 正则表达式的语法规则 常用正则表达式举例
  • 3. 什么是正则表达式?什么是正则表达式? 正则表达式(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 正则表达式的用途: 验证字符串是否合法 查找指定格式的字符串 替换指定格式的字符串 提取符合指定格式的字符串
  • 4. 重要声明正则表达式是一个独立的模式匹配规则,有自己的格式与语义规定。现今很多语言都支持正则表达式处理文本,如Java, C#, Javascript, PHP, Perl, Python等。 不同的语言对正则表达式的支持方式可能不同,所支持语法细节规则也可能不同,在使用时请根据特定的语言去使用正则表达式。
  • 5. 怎么认识正则表达式使用Java正则表达式编程与传统编程相比: 优点: 简化代码编写,提高处理效率 在判断Email,IP等格式时,使用传统的对字符串比较的方式,可能需要几十行代码,而使用正则表达式,则只需要几行就能解决问题。 缺点: 需要单独学习Java正则表达式 写出来的程序不易理解,可读性不好
  • 6. Java对正则表达式的支持Java中对正则表达式的使用: 独立使用:Java在提供了java.util.regex.Pattern类和java.util.regex.Matcher类支持正则表达式的使用 结合String类使用,涉及的方法有: matches replaceAll split
  • 7. Pattern类使用示例共享模式使用: Pattern p = Pattern.compile(“cat”); Matcher m = p.matcher(“ablackcat”); boolean finded = m.find(); //尝试查找与该模式匹配的输入序列的下一个子序列 boolean matched = m.matches(); //整个区域与模式匹配 独立模式使用: boolean matched = Pattern.matches(“cat”, “cat”);
  • 8. String类的方法使用示例String类的几个方法(matches, replaceAll, split)可以直接传入正则表达式,如下: boolean m = "ablackcat".matches(".*cat"); String[] strs = “aaa,bbb,ccc”.split(“,”);
  • 9. 简单字符匹配假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。如: 注:简单字符直接与其本身的组件匹配。
  • 10. 常用元字符元字符是一些预定义的字符类,如下表:
  • 11. 元字符解析\b: \b表示一个单词的边界,但并不匹配它。如hi匹配hi,his,history,this,但是只想匹配hi这一个单词,则可以使用\bhi\b ^和$: 同\b类似,^表示匹配一个字符串的开始,$表示匹配一个字符串的结束,如^\d\d$只匹配长度为2的两个数字
  • 12. 转义字符如果要匹配元字符本身或一些控制字符,必须使用“\”对字符进行转义。如: \\ 匹配\ \. 匹配. \* 匹配* ourchr\.com匹配”ourchr.com”字符串 c:\\window匹配”c:\window”字符串
  • 13. 匹配重复次数如果匹配我国邮政编码(6位数字),可以这样写:\d\d\d\d\d\d,然而写法太繁琐。 使用下表的符号来修饰紧跟它前面的字符的出现次数:上例的邮政编码可以这样写:\d{6} 如QQ号码必须是5到12位的数字,可以这样写:^\d{5,12}$ ^\w+则匹配一行的第1个单词
  • 14. 字符类要想匹配字母,数字或空白等字符已经很简单了,因为有对应的元字符,但如果要你匹配元音字母(a, e, i, o, u)中的任一个,怎么实现? 放在方括号[]中列出它,如[aeiou],表示匹配[]中的任一个字符。[.?!]表示匹配标点符号.或?或! 在括号[]中可以用连接符”-”来指定一个范围,如[0-9]表示匹配0到9中的任一个数字,与\d相同,[a-zA-Z0-9]表示匹配任一字母或数字
  • 15. 分支条件正则表达式的分支就是指定几种规则,如果满足其中一种规则就匹配它,使用|符号把这几种规则分隔开 \d{18}|\d{15}匹配15或18位的身份证号码,0\d{2}-\d{8}|0\d{3}-\d{7}表示匹配3位区号的8位号码或4位区号的7位号码,如010-12345678,0551-5231888 使用分支条件时,要注意各个条件的顺序,如\d{15}|\d{18}可不能匹配18位的号码
  • 16. 分组重复单个字符很简单,直接在单个字符后面跟有重复次数限定符就可以了,但如果是重复多个字符怎么办?使用分组解决 分组就是使用小括号()指定的子表达式 当使用小括号()指定的分组(子表达式),就可以对这个分组使用重复次数限定符了。 (\d{1,3}\.){3}\d{1,3}就是一个简单的IP匹配表达式,如192.168.2.254,使用()对前3个数字和一个.进行分组,但这个式子也匹配如256.300.555.999这种非法的IP,确定的IP的匹配表达式应是: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
  • 17. 反义如果需要查找不属于某个简单定义的字符,就要使用反义,比如查找不是数字的字符,或不是字母的字符如:\S+匹配不含空白符的字符串,]+>匹配用尖括号括起来的以a开头的字符串
  • 18. 后向引用使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。
  • 19. 后向引用(\d{1,3})\1表示匹配连续重复的1位,2位或3位数字,对于字符串”555.9999”匹配的是55和9999 \b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。
  • 20. 分组语法分组语法:捕获与零宽断言
  • 21. 贪婪与懒惰当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。这种行为称为贪婪匹配。 如a.*b通常匹配最长的以a开头以b结束的字符串,如用它搜索字符串”aabab”的话,它会匹配整个字符串”aabab” 有时我们需要懒惰匹配,就是匹配尽可能少的字符。给重复次数限定符后面加上一个“?”就是启用懒惰匹配模式。如a.*b搜索“aabab”将匹配”aab”
  • 22. 懒惰匹配限定符
  • 23. 处理选项在使用正则表达式的时候,可以指定处理的默认选项,如是否区分大小写等 在java的Pattern类中,用方法 public static Pattern compile(String regex, int flags)来指定处理选项,其中flags所对应的处理选项: Pattern.CASE_INSENSITIVE Pattern.MULTILINE Pattern.DOTALL Pattern.UNICODE_CASE Pattern.CANON_EQ Pattern.UNIX_LINES Pattern.LITERAL Pattern.COMMENTS
  • 24. java中的处理选项
  • 25. 常用的正则表达式举例^.*\S+.*$: 匹配一个非空字符串 \w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*:匹配一个email [a-zA-z]+:\/\/[^\s]*: 匹配一个URL ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):匹配一个IP
  • 26. EndQ & A