正则表达式详细笔记,Java

来源:互联网 发布:aop编程 编辑:程序博客网 时间:2024/05/18 02:08

1. 正则表达式是一种匹配和处理文本的字符串
2. Java中相关的类: String类,Pattern类,Matcher类。
3. 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中, 所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是:
Pattern p = Pattern.compile("a*b"); // 将给定的正则表达式编译到模式中,以后使用时会更快,也方便于使用Pattern类的一些方法 Matcher m = p.matcher("aaaaab"); // 创建匹配给定输入与此模式的匹配器;执行匹配所涉及的所有状态都驻留在匹配器中 boolean b = m.matches();
等价于: boolean b = Pattern.matches("a*b", "aaaaab");
// 使用这种方法要注意:第一个参数是正则表达式
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式

4. 匹配纯文本

5. . * + ?
X?X,一次或一次也没有X*X,零次或多次X+X,一次或多次

5. 匹配的并不总是整个字符串

6. 困难在于验证其不会匹配到不想要的字符串

7. 字符集合常用在不需要区分大小写的地方 [Rr]eg[Ee]x ,可以用^字符来取非

// 注:在定义一个字符区间时,一定要使尾字符大于首字符,否则模式是没有意义的
(如:[9-5],是没有意义的)

8. 示例:
System.out.println(Pattern.matches("[\\d&&[68]][\\d&&[68]][\\d&&[68]]","686"));
System.out.println("na1.xls".matches("[ns]a.\\.xls"));
9.
POSIX 字符类(仅 US-ASCII)
Unix中的标准

11. JavaScript中不支持在正则表达式中使用POSIX字符类

12. * + 是贪婪型元字符(*与+都是首先读取最多书屋字符,但是*会从后吐出不匹配的字符,即尽可能从开头匹配到末尾;但是+不会吐出,即+后面的表达式可能用不上)。表达式加上?变为懒惰型字符(从开头匹配,一旦匹配出符合表达式的子字符串就结束)
eg:
对于字符串"abcd3efg2A1"
使用表达式".{1,11}\\d",检测结果为:abcd3efg2A1
而使用".{1,11}?\\d",检测结果为:abcd3 efg2 A1
使用".{1,11}+\\d",匹配错误

// 综合示例:
System.out.println(m.matches());System.out.println(Pattern.matches("[\\d[68]][\\d[68]][\\d[68]]","686"));System.out.println("na1.xls".matches("[ns]a.\\.xls"));p("A_1_23".matches("\\w{6,}"));p("abcW_%**123456 123".matches("\\w{5}[%*&]+\\d{6,}\\s\\d+"));p("\\".matches("\\\\"));p("4".matches("[3-5]"));p("123-".matches("\\d+-"));// - 字符不需要被转义p("ww&?123".matches("[^0-9]{2,}\\d+"));p("dgsrebesf".matches("\\p{Alpha}{5,10}"));// p("hello world".matches("^h[a-z]{1,3}o\\b\\s\\w+ld$"));// 边界匹配器p("ben.sichuan@wanghai.123.com".matches("[\\w.]+\\.\\w+@\\w+[\\w\\.]+\\w+"));//贪婪型元字符(尽可能从开头匹配到末尾)p("<B>AK</B> and <B>HI</B>".matches("<[B]>.*</[B]>"));//懒惰型元字符(从开头匹配,匹配出一个就结束)p("<B>AK</B> and <B>HI</B>".matches("<[B]>.*?</[B]>"));p("   \n".matches("^[\\s&&[^\\n]]*\\n$"));// 匹配空格换行public static void p(Object o){System.out.println(o);

13. Macher类:
matches 方法尝试将整个输入序列与该模式匹配。
lookingAt 尝试将输入序列从头开始与该模式匹配。
find 方法扫描输入序列以查找与该模式匹配的下一个子序列。如果匹配成功,则可以通过startendgroup 方法获取更多信息
// find 方法是贪婪型的——对于"\\d{2,5}",find方法会尽量检测5个数字
reset 方法重置匹配器(避免matches方法与find方法之间产生冲突)
// 示例:
Pattern p=Pattern.compile("\\d{2,5}");
Matcher m=p.matcher("00005----1s11115222225s35");
//System.out.println(m.matches());
//m.reset(); // 重置
p(m.find());
p(m.find());
p(m.find());
p("第三个子字符串开始于:"+m.start()+"结束在"+m.end());
p(m.find());
// 注:四个结果都是true,00005----1s11115222225s35中的“1s”会被忽略,find在与其检测匹配的子字符串返回true ,所以222225中最后的“5”也被忽略,从而直接s35

14. 实例:查找Java并替换,并显示字符串尾巴
Pattern p=Pattern.compile("java",Pattern.CASE_INSENSITIVE);Matcher m=p.matcher("Java java JAVA jaVA vajava  JAvaa kjafhjavak  tail");StringBuffer buf=new StringBuffer();int i=0;while(m.find()){i++;if(i%2==1)m.appendReplacement(buf, "java");elsem.appendReplacement(buf, "JAVA");}m.appendTail(buf);p(buf);


15. 正则表达式分组:用“()”分,分组是由序号的,从左往右数(应用于将查找到的结果分开显示)
也称之为子表达式,可以简化正则表达式的写法
eg:
  • (\\d{1,5})([a-z]{2,3}) 该正则表达式匹配到符合的语句后,可以在group()方法中设置参数,以单独显示匹配到的语句中的数字、字母
  • (\\d{3}\\.){2}(\\d.)\\d等价于\\d{3}\\.\\d{3}\\.\\d\\.\\d
  • 表达式20|19\\d{2}并不会找出20或21世纪的年份(如2017),只会找到20或19**,因为“|”将其前面或后面的表达做为一个整体看待(一个是20,另一个是19\\d{2}),正确的写法是:(20|19)\\d{2}

16. 示例:查找出文件中可能的手机号码:
import java.io.*;import java.util.regex.Matcher;import java.util.regex.Pattern;public class GetEmail {static int k=0;public static void main(String[] args) throws FileNotFoundException {BufferedReader br=new BufferedReader(new FileReader("view-source_tieba.baidu.com_p_3977844275.html"));String line="";int i=1;try {while((line=br.readLine())!=null){getEmail(line);}} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}System.out.println("共找到 "+k+" 个类似于手机号码的11位数字");}public static void getEmail(String line){Pattern p=Pattern.compile("1[3578][\\d]{9}");Matcher m=p.matcher(line);while(m.find()){k++;System.out.println(m.group()); }}}


17. 单词边界
表达式“find”会找到*find*
“\bfind”会找到find*
“\bfind\b”会找到find
字符串边界:^匹配字符串开头位置,$匹配字符串结尾

18. 分行匹配模式:(?m)会将行分隔符当做一个字符串分隔符对待,比如匹配注释语句时可以用到

19. 前后查找操作符:
正向前查找:?= 正向后查找:?<m=
负向前查找:?! 负向后查找:?<!




1 0
原创粉丝点击