课程目的:
了解什么是正则表达式
理解正则表达式的作用
掌握正则表达式的规则
掌握正则表达式是如何使用
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符,例如字符(a到z)以及特殊字符(元字符)
组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串
进行匹配。
在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往
会浪费程序员时间及精力。因此,使用正则表达式,便成了解决这一矛盾的主要手段。
常用的正则表达式
\\反斜杠
\t间隔('\u0009')
\n换行('\u000A')
\r回车('\u000D')
\d数字 等价于 [0-9]
\D非数字 等价于[^0-9]
\s空白符号[\t\n\x0B\f\r]
\S非空白符号[^\t\n\x0B\f\r]
\w单独字符[a-zA-Z_0-9]
\W非单独字符[^a-zA-Z_0-9]
\f换页符
\e Escape
\b 一个单词的边界
\B一个非单词的边界
\G前一个匹配的结束
^为限制开头
^java 条件限制为以java为开头的字符
$为限制结尾
java$ 条件限制为以java为结尾的字符
.为限制一个任意字符
java.. 条件限制为java后除换行外任意两个字符
[] 加入特定的限制条件
[a-z] 条件限制在小写a~z范围中一个字符
[0-9a-z] 条件限制在小写0~9或a~z范围中一个字符
[0-9[a-z]] 条件限制在小写0~9或a~z范围中一个字符(交集)
贪婪量词范例:用来指定字符可能出现的次数
X? X可出现一次或完全没有
X* X可出现零次或多次
X+ X可出现一次或多次
X{n} X可出现n次
X{n,} X可出现至少n次
X{n,m} X可出现至少n次,但不超过m次
匹配方式
Pattern p = Pattern.compile("a*b"); //a*b表示匹配规则
Matcher m = p.matcher("aaaaab");//aaaab表示需要匹配的内容
boolean b = m.matches();//使用matches默认调用注册的规则
String email = "[email protected]@m";
Pattern p1 = Pattern.compile("@");
Matcher m1 = p1.matcher(email);
相关类
java.util.regex.Pattern //获得此对象,方便匹配器共享同一模式
java.util.regex.Matcher //功能操作 匹配器
静态方法
static Pattern compile(String regex) ★ //将给定的正则表达式编译到模式中
static Pattern compile(String regex,int flags) ★ //将给定的正则表达式编译到具有给定标志的模式中。
flags表示按某种匹配方式,可选的匹配方式有
CASE_INSENSITIVE --启用不区分大小写的匹配,此标志可能对性能产生影响。
COMMENTS --
MULTILINE --启用多行模式。?需要上网查?
DOTALL --启用dotall模式。在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。
问题:怎么开启匹配行结束符?
UNICODE_CASE 启用Unicode感知的大小写折叠。
CANON_EQ 启用规范等价 ?
UNIX_LINES 启用Unix行模式 在此模式中,.、^ 和 $ 的行为中仅识别 '\n' 行结束符。
LITERAL 启用模式的字面值解析。指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。
COMMENTS 模式中允许空白和注释。此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。
static bolean matches(String regex,CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。如果input中的所有内容符合匹配器的模式,则返回true
static String quote(String s) 返回指定String的字面值模式String。 当我们需要查找的时候,需要使用字面意义是,先使用此方法或得字面值字符串替换,然后通过Pattren.compile(String regex)编译
int flags 返回此模式的匹配标志。
Matcher matcher(CharSequence input) ★ //创建匹配给定输入与此模式的匹配器
input 表示:要匹配的字符序列
public String[] split(CharSequence input) --围绕此模式的匹配拆分给定输入序列。 此方法的工作方式类似于使用给定的输入序列和限制参数零调用两参数 (java.lang.CharSequence, int) split} 方法。因此,得到的数组中不包括尾部空字符串。
public String[] split(CharSequence input,int limit) --围绕此模式的匹配拆分给定输入序列。 此方法返回的数组包含输入序列的子字符串,由匹配此模式的另一子序列或输入序列的结尾终止。数组中子字符串的顺序与其在输入中出现的顺序相同。如果此模式与输入的任何子序列都不匹配,那么得到的数组仅包含一个元素,即字符串形式的输入序列。
limit 参数
控制应用模式的次数,从而影响结果数组的长度。如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。
字符串应用实例:
package com.lizhenhua.regular;
public class RegularExpressionDemo {
public static void main(String[] args) {
String text = "abcdebcadxbc";
String regex = ".bc";//正则表达式匹配规则:此处匹配的是任意一个字符与bc组合
String[] tokerns = text.split(regex);//split方法是以该匹配的字符串进行分割数据
//打印分割后的数据,中间用一个空格间隔
for (int i = 0; i < tokerns.length; i++) {
System.out.print(tokerns[i] + " ");
}
}
}
该程序运行后的结果为:
d ad
字符串中应用场景二:
package com.lizhenhua.regular;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class RegularExpressionDemo2 {
public static void main(String[] args) {
//获取控制台输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//替换数据应用
String regex = ".bc";//正则表达式规则
String replacement = "###";//替换数据格式
System.out.println("abcdesssfes".replaceAll(regex, replacement));
//
String phoneEL = "[0-9]{4}-[0-9]{6}";//电话匹配规则
String urlEL = "<a.+href*=*['\'']?.*?['\'']?.*?>";//url匹配规则
String emailEL = "^[_a-z0-9-]+(.[_a-z0-9-]+)*"+"@[a-z0-9-]+([.][a-z0-9-]+)*$";//email匹配规则
System.out.println("请输入手机号码:正确格式为0000-100000");
String input;
try {
//取得控制台输入的一行数据
input = reader.readLine();
//验证电话号码
if(input.matches(phoneEL)){
//符合电话号码
System.out.println("电话号码格式正确");
}else{
System.out.println("电话号码格式错误");
}
System.out.println("请输入href标签:正确格式: <a href='www.baidu.com/messages/index.jsp'>");
//验证href标签
input = reader.readLine();
if(input.matches(urlEL)){
//符合href标签
System.out.println("href格式正确");
}else{
System.out.println("href格式错误");
}
System.out.println("请输入邮箱:");
input = reader.readLine();
//验证邮箱规则
if(input.matches(emailEL)){
//符合邮箱
System.out.println("邮箱格式正确");
}else{
//不符合邮箱
System.out.println("邮箱格式错误");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//关闭输入流
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
该程序运行结果:
###desssfes
请输入手机号码:正确格式为0000-100000
2322-333333
电话号码格式正确
请输入href标签:正确格式: <a href='www.baidu.com/messages/index.jsp'>
<a href='www.hao.com/messages/index.jsp'>
href格式正确
请输入邮箱:
[email protected]
邮箱格式正确