JAVA正则表达式
我个人认为正则表达式是很好用很强大的,在编写程序中很多地方都用的到,这里有一些我学习的基础理解和大家分享,欢迎一起讨论。
正则表达式是一种用来表达语法规则的字符串,是一种字符串匹配的模式,用于解析字符串。由普通字符和元字符构成。普通字符指的是字母、中文、数字等,元字符指的是特殊字符(用一个或一组代替一个或多个字符的字符)。
常用的特殊字符:
java中的正则表达式特殊地方:
在其他语言的正则表达式中,一个\就具有特殊意义,两个\表示一个普通的\。而在java的正则中,两个\表示后面的字符有特殊意义,而表示一个普通的\就需要四个\。
捕获组:
捕获组是通过从左至右计算其开括号来编号,分组解析。例如在表达式((A)(B(C)))可以根据括号解析为4个组
1.((A)( B( C ) ) )
2.(A)
3.(B ( C ))
4.( C )
每一组都指一个子表达式
非捕获匹配:
(?:pattern):
表示未捕获分组,字符串依然需要匹配该表达式,但是该表达式的值不会存储,只是可以供其他表达式使用,例如
(industr(y|ies)) 匹配 industry ,我们会得到两组,一个industry 和一个y。
因为我们要一个单的y或者ies没有意义,所以需要(?:)
(industr(?:y|ies)) 匹配 industry ,我们只会得到industry ,而这是我们想要的。
我认为这个语法很多情况下都会遇到,所以需要掌握。
(?=pattern) 正向肯定预查:
以 xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxx
(?!pattern) 正向否定预查:
以 xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxx
(?<=pattern) 反向肯定预查:
以(?<=pattern)xxx为例,就是捕获以pattern开头的内容xxx。
(?<!pattern) 反向否定预查:
以(?<!pattern)xxx为例,就是捕获不以pattern开头的内容xxx。
java实例代码:
//取字符串中的年月//title-标题 patten-正则表达式 String title="5月的太原售电量";String patten="(\\d{4}年)(\\d{1,2}月)";//用正则创建Pattern对象Pattern compile = pile(patten);//用Pattern对象匹配写好的正则返回Matcher对象Matcher matcher = compile.matcher(title);//循环取Matcher对象匹配到的组while (matcher.find()){//groups 匹配到多少组int groups = matcher.groupCount();System.out.println(groups);//循环输出每组表达式匹配的字符串for (int i = 1; i <=groups ; i++) {String group = matcher.group(i);System.out.println(group);}}
结果: