正则表达式
正则表达式(Regular Expressions)
用来匹配字符串的一种方式
是文本处理器中常用的工具
主要应用包括:匹配验证,分割,查找,替换
正则表达式的写法
字符{数量}位置
如:[0-9]{2,4}\b
[0-9]表示数字0-9,{2,4}表示数字的个数为2-4;
正则表达式的基本元素
字符 | 含义 | 描述 |
---|---|---|
. | 代表一个字符的通配服 | 能和回车符之外的任何字符相匹配 |
[] | 字符集 | 能和括号内的任何一个字符相匹配。方括号内也可以表示一个范围,用“-”符号将起始和末尾字符区分开来,如[0-9] |
[^] | 排斥性字符集 | 和集合外的任意字符匹配 |
^ | 起始位置 | 定位到一行的起始处并向后匹配 |
$ | 结束位置 | 定位到一行的结尾处并向前匹配 |
\b | 单词边界 | |
\B | 非单词边界 | |
() | 组 | 按照子表达式进行分组 |
| | 或 | 或关系的逻辑选择,通常和组结合使用 |
\ | 转义 | 匹配反斜线符号之后的字符,所以可以匹配一些特殊符号,如& |
数量
符号 | 含义 | 描述 |
---|---|---|
* | 零个或多个 | 匹配表达式首项字符的零个或多个副本 |
+ | 一个或多个 | 匹配表达式首项字符的一个或多个副本 |
? | 零个或一个 | 匹配表达式首项字符的一个或零个副本 |
n(数字) | 重复 | 匹配表达式首项字符的n个副本 |
字符
符号 | 含义 |
---|---|
\d | 表示数字,相当于[0-9] |
\D | 表示非数字,相当于[^0-9] |
\s | 表示空白符,相当于[\t \n \x0B \f \r] |
\S | 表示非空白符,相当于[^\s] |
\w | 表示单词字符,相当于[a-zA-Z_0-9] |
\W | 表示非单词字符,相当于[^\w] |
因为这个正则表达式比较复杂,可以使用一些工具帮助我们调整正则表达式
在java中使用正则表达式(Pattern类)
需要导入一个java.util.regex包,Pattern这个类就在这个包里面,匹配的结果叫Matcher类
应用之一:分割
//对以逗号和/或空格分隔的输入字符串进行切分
/**
* 分割
* 对以逗号和/或空格分隔的输入字符串进行切分
*/
import java.util.regex.Pattern;
public class RegexSplitter {
public static void main(String[] args) {
Pattern p =Pattern.compile("[,\\s]+");//匹配逗号,和空字符用于分割
String [] result=
p.split("one, two , three, four,five ");
for(int i=0;i<result.length;i++){
System.out.println(result[i]);
}
}
}
运行结果:
one
two
three
four
five
应用:匹配验证
import java.util.regex.Pattern;
/**
* 匹配验证.
* 检查邮箱格式是否正确
*/
public class RegexEmailValidate {
public static void main(String[] args)
throws Exception{
String pattern="^[^@]+@[\\w]+(\\.[\\w]+)*$";//从开头开始,不以@开头,@后允许是单词
String email="YanCter@qq.com";
boolean ok= Pattern.matches(pattern,email);
System.out.println(ok);
}
}
运行结果:
true
Matcher类
通过调用某一个模式(Pattern对象)的matcher方法可以得到Matcher对象
Matcher类中的方法:
find方法将扫描输入序列,寻找下一个与模式匹配的地方。
appendReplacement方法
Matcher中的group
group(分组),是指正则表达式中一对圆括号包括的那一部分
group(0)或group()表示整个匹配项,group(1),group(2)…表示各个分组
替换时,$0表示整个匹配项,$1,,2…表示各个分组;
应用 查找替换
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexReplacement {
public static void main(String[] args)
throws Exception{
Pattern pattern=Pattern.compile("cat");//匹配的为cat
Matcher matcher=pattern.matcher(
"one cat,two cats in the yard");
StringBuffer sb=new StringBuffer();
while(matcher.find()){//循坏查找
matcher.appendReplacement(sb,"big $0");//$0 整个匹配项 用big和一个空格加原来的匹配项替换掉原来的匹配项
}
matcher.appendTail(sb);//把剩下的也加入进去
System.out.println(sb.toString());
}
}
运行结果:
one big cat,two big cats in the yard
/**
* 在网页中寻找链接网址
*/
import java.util.regex.*;
class RegexHref {
public static void main(String[] args) {
String patternString =
"\\s*(href|src)\\s*=\\s*(\"([^\"]*\")|(\'[^\']*\')|([^\'\">\\s]+))";
String text =
"<a href=\"http://aaa.htm\">bbb</a> <img src=\"http://bb.com/pic.jpg\">";
Pattern pattern = Pattern.compile(patternString,
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher( text );
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
//整个捕获,相当于goup(0)
buffer.append("获捕到" + matcher.group());
//捕获中的一部分(第2对圆括号对应的,即是网址)
buffer.append(" 其中网址为" + matcher.group(2));
buffer.append("\r\n");
}
System.out.println(buffer.toString());
}
}