目录:1.正则概述 2.常用符号及易错点 3.正则使用 4.String类中的正则
1.正则概述
Pattern:正则表达式的编译表示形式
指定为字符串的正则表达式必须首先被编译为此类的实例。
Matcher:通过解释 Pattern
对执行字符串匹配操作的引擎。
执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
典型的调用顺序:
String regex =\\w+@\\w+[.]((com)|(cn));
String str = "xxxxxxxxxxxxxx";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher
(str);
boolean b = m.matches
();
仅使用一次正则表达式时,可以方便地通过此类定义matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches(regex,str);
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
2.常用符号及易错点
1. . 匹配单个字符 * 匹配0至多个在它之前的字符 + 匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次 | 将两个匹配表达式做或运算
2. [ ]匹配括号中的任意一个字符 { } 匹配次数
() 将()之间括起来的表达式定义为组group,从左到右计算其开括号来编号。
将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。
3. ^ 匹配一行的开始 ^spring $匹配一行的结束 SPRING$
4. 组:这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。
组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,
组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
易错点:
\ 的使用:在其他语言中,\\表示要插入的是一个字符,java中\\表示要插入的是正则表达式中的反斜线,
与后面的字符连在一起有特殊意义,如\\d,\\w等。
如何在java的正则中插入一个\字符:代码为\\\\,因为在java中\\表示一个\。
但是如果在java中使用回车换行等,则不需要多添加反斜线了,如回车直接为\r。
3.正则使用
a.Matcher类的方法:
boolean matches():尝试将整个区域与正则匹配
boolean find():尝试查找与该模式匹配的下一个子序列
public static void main(String[] args) throws IOException {
// 定义正则并获取匹配器:
String regex = "(\\w)+[\\.](\\w)+[\\.]((com)|(cn))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("");
System.out.println(matcher.matches());
// 打开网络资源
URL url = new URL("http://www.hao123.com/");
URLConnection urlConnection = url.openConnection();
InputStream ips = urlConnection.getInputStream();
BufferedReader bufr = new BufferedReader(new InputStreamReader(ips));
String line = null;
// 对网络内容进行匹配并输出符合匹配模式的字符串,注意每一行都要重置具有新输入序列匹配器
while((line=bufr.readLine())!=null){
//对新输入序列进行重新匹配
matcher.reset(line);
while(matcher.find()){
System.out.println(matcher.group());
}
}
// 关闭网络资源
ips.close();
4.String类中的几个正则方法
个人理解为String类中关于正则的几个方法是为了使用方便而定义,不需要每次都去获取匹配器。
总共有以下方法:
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
代码示例:
System.out.println("--------检验是否符合QQ号码规则----------");
获取输入的QQ字符串
String strNum = new Scanner(System.in).nextLine();
定义正则:不能以0开头,5-10位数字
String regex = "[^0][\\d]{4,9}";
进行匹配
boolean matchResult = strNum.matches(regex);
System.out.println(matchResult);
String[] split(String regex):根据给定的正则表达式来匹配拆分此字符串
等同于 Pattern.compile(regex).split(str);
String[] split(String regex,int limit): 同上,只是限定了匹配模式的使用情况
等同于 Pattern.compile(regex).split(str);
String replaceAll(String regex, String replacement ):使用给定的replacement替换
此字符串所有匹配给定正则表达式的子字符串。
代码示例如下:
// 去除重复汉字,要求打印效果为:我是程序员
String str = "我我我我....是是是是是....程程程程程...序。。。员";
// 1.去除非汉字字符
String resultStr = str.replaceAll("[(\\.)|(。)]", "");
// 2.定义重复字符的正则,定义替代元素,注意组的重复和单个字符的区别,注意$的使用
String regex1 = "(.)\\1+";
String replacement1 = "$1";
String finalStr = resultStr.replaceAll(regex1, replacement1);
System.out.println(finalStr);
代码示例:对IP地址进行排序
String ipStr = "23.125.35.12 23.45.56.123 45.65.255.45";
String ipStrRegex = ipStr.replaceAll("(\\d+)", "00$1");
String ip = ipStrRegex.replaceAll("0*(\\d{3})", "$1");
String[] ipArr = ip.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for(String ipEle : ipArr){
ts.add(ipEle);
}
for(String ipEle : ts){
System.out.println(ipEle.replaceAll("0*(\\d+)","$1"));
}