目录
1、正则表达式入门
2、Java类
2.1 String类
2.1.1 数量匹配
2.1.2 范围匹配:
2.1.3 预定义字符:
2.1.4 边界匹配器
2.1.5 String 的split方法
2.1.5 String 的replaceAll方法
3、Pattern 和Matcher
4、常用的正则表达式
1、正则表达式入门
Regular expression 正则表达式
在计算机科学中,是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达
式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。总结:正则表达式是用于指定字符串的模式
例如:
上网中需要注册账号,注册密码,注册邮箱.会检测是否符合规则.如何进行检测?
要求注册用户名中不能有数字: jack1234.
需要将字符串转换为字符数组进行遍历.使用程序也可以实现,但是有比这个更方便的实现方式,就是正则.
字符串处理利器:
正则是一种强大灵活的文本处理工具.使用正则表达式,能够解决各种字符串相关的问题:
字符串匹配
字符串查找
字符串替换
举例:
验证用户注册用户名是否符合规则(6到16位,不能以数字开头,不能有特殊字符)
验证邮箱地址是否合法
验证qq号
2、Java类
java.lang.String
java.util.regex.Pattern
java.util.regex.Matcher
String类
如: boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
该方法中传递的就是字符串形式组成的规则
如:String replaceAll(String regex, String replacement)
将符合规则的字符串替换为 replacement
如:String[] split(String regex)
按照指定规则切割字符串
Pattern类
该类是Java中专门用于描述正则的类.位于java.util.regex包中.该类的对象就是正则的对象表现形式.
典型用法:
Pattern p = Pattern.compile("a*b"); //指定规则(字符串),创建正则对象
Matcher m = p.matcher("aaaaab"); //匹配字符串.
boolean b = m.matches();
2.1 String类
测试 matches(String regex) 方法.
体验正则: 测试 . 符号代表的规则.
System.out.println("a".matches(".")); System.out.println("abc".matches("...")); System.out.println("abcd".matches("...")); |
“.” 代表任意字符. 该方法返回之一boolean类型的结果.
2.1.1 数量匹配
/** * <pre> * Possessive 数量词 * X? X,一次或一次也没有 * X* X,零次或多次 * X+ X,一次或多次 * X{n} X,恰好 n 次 * X{n,} X,至少 n 次 * X{n,m}X,至少 n 次,但是不超过 m 次 * * <pre> */ // 讲解数量词 // ? // String str = "acb"; // String reg = "ac?b"; // System.out.println(str.matches(reg)); // * // String str = "acccb"; // String reg = "ac*b"; // System.out.println(str.matches(reg)); // + // String str = "ab"; // String reg = "ac+b"; // System.out.println(str.matches(reg)); // {n} // String str = "acccb"; // String reg = "ac{3}b"; // System.out.println(str.matches(reg)); // {n,} // String str = "accccb"; // String reg = "ac{3,}b"; // System.out.println(str.matches(reg));
//{n,m} String str = "acccccb"; String reg = "ac{3,5}b"; System.out.println(str.matches(reg)); |
验证QQ号码,规则5~15位数字,开头不能是0
// qq 5~15 不能0开头 String qq = "123456789012345"; System.out.println(qq.matches("[1-9][0-9]{4,14}")); System.out.println(qq.matches("[1-9]\\d{4,14}")); |
2.1.2 范围匹配:
注意:用于判断字符中的某一位.例如[abc] 要么是a 要么是b 要么是c
如果要判断字符串,要结合数量匹配一起使用.
/** * <pre> * 字符类 默认一次只匹配一个字符 * [abc] a、b 或 c(简单类) * [^abc] 任何字符,除了 a、b 或 c(否定) * [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) * [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) * [a-z&&[def]] d、e 或 f(交集) * [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) * [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) * * </pre> * */ // [abc] String str = "acb"; String reg = "[abc][abc][abc]"; System.out.println("[abc]:" + str.matches(reg)); // [^abc] str = ""; reg = "[^abc][^abc][^abc]"; System.out.println("[^abc]:" + str.matches(reg)); // [a-z] str = "hello java"; reg = "[a-z]*"; System.out.println("[a-z]:" + str.matches(reg)); // [a-zA-Z] str = "HelloJava"; reg = "[a-zA-Z]*"; System.out.println("[a-zA-Z]:" + str.matches(reg)); // [a-d[m-p]] str = "abcdef"; reg = "[a-c[d-f]]*"; System.out.println("[a-d[m-p]]:" + str.matches(reg));
//[a-z&&[def]] str = "def"; reg = "[a-z&&[d-f]]*"; System.out.println("[a-z&&[def]]:" + str.matches(reg));
// [a-z&&[^bc]] str = "abce"; reg = "[a-z&&[^df]]*"; System.out.println("[a-z&&[^bc]]:" + str.matches(reg));
//[a-z&&[^m-p]] str = "abc"; reg = "[a-z&&[^d-f]]*"; System.out.println("[a-z&&[^bc]]:" + str.matches(reg)); |
验证手机号码(13 或者15)共11位,第一位数字是1
// 验证手机号 String tel = "13121810615"; System.out.println(tel.matches("1[35]\\d{9}")); |
注释: 手机号码:^1[3|4|5|8][0-9]\\d{8}$
2.1.3 预定义字符:
例如:Java中\d表示一位数字.由于Java中的\ 反斜线是转义字符,需要表示\ 需要\\
/** * <pre> * 预定义字符 * . 任何字符(与行结束符可能匹配也可能不匹配) * \d 数字:[0-9] * \D 非数字: [^0-9] * \s 空白字符:[ \t\n\x0B\f\r] * \S 非空白字符:[^\s] * \w 单词字符:[a-zA-Z_0-9] * \W 非单词字符:[^\w] * </pre> * */ // \d String str = "1"; String reg = "\\d"; System.out.println("\\d :" + str.matches(reg)); str = "12345"; reg = "\\d*"; System.out.println("\\d :" + str.matches(reg)); // \D 非数字 str = "1abc"; reg = "\\d[a-z]*"; System.out.println("\\D :" + str.matches(reg)); // \s str = "a b"; reg = "\\w\\s{2}\\w"; System.out.println("\\s :" + str.matches(reg)); |
案例:说出结果
System.out.println("-1234".matches("-?\\d+")); // true System.out.println("8800".matches("-?\\d+")); // true System.out.println("+800".matches("-?\\d+")); // false System.out.println("+800".matches("(-|\\+)?\\d+")); // true // -? -一次或0次 // (-|\\+)? -或者+一次或0次,+在正则中有特殊含义使用\\进行转义,就表示普通字符+ |
2.1.4 边界匹配器
边界匹配器 ^ 行的开头 $ 行的结尾 \b 单词边界 \B 非单词边界 \A 输入的开头 \G 上一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符(如果有的话) \z 输入的结尾 |
例如:
检测字符串信息是否以非0数字开头.
检测字符串是否以.java结尾
System.out.println("45678".matches("^[^0]\\d+")); |
2.1.5 String 的split方法
按照指定规则切割字符串
是一个非常有用的正则表达式工具,功能是将字符串从正则表达式匹配的地方切开.
案例:
切割: "jack-lucy-lili" 以- 切割
切割: "jack lucy lili" 以空格切割,注意:有多个空格 “ +”
切割: "jack.lucy.lili" 以.切割 注意:要转义\\.
切割: "jack\\lucy\\lili" 以\\切割 注意:要转义\\\\
public class Demo2 { public static void main(String[] args) { split1(); split2(); split3(); split4(); } /* * "jack\\lucy\\lili" 以\\进行切割,注意转义 */ private static void split4() { String str = "jack\\lucy\\lili"; String[] split = str.split("\\\\"); System.out.println(Arrays.toString(split)); } /* * "jack.lucy.lili"; 以.进行切割 注意转义. . 在正则中是一个特殊字符。如果只当作普通符号来用,必须要转义。 */ private static void split3() { String str = "jack.lucy.lili"; String[] split = str.split("\\."); System.out.println(Arrays.toString(split)); } /* * "jack lucy lili"; 以空格字符取 注意:多个字符 */ private static void split2() { String str = "jack lucy lili"; String[] split = str.split(" +"); System.out.println(Arrays.toString(split)); } /* * "jack-lucy-lili"; 取-左右 */ private static void split1() { String str = "jack-lucy-lili"; String[] split = str.split("-"); System.out.println(Arrays.toString(split)); } } |
2.1.5 String 的replaceAll方法
案例:
"helloworld" 将o替换为#
"tel12344556qq4564654add4646767" 数字(4位以上)替换为#
private static void replaceAll1() { String str = "helloworld"; String replaceAll = str.replaceAll("o", "xx"); System.out.println(replaceAll); } private static void replaceAll2() { String ss = "tel12344556qq4564654add4646767"; String str = ss.replaceAll("\\d{4,}", "#"); System.out.println(str); } |
案例:
"aabbbccccd" 两两重复的字符替换为# 效果: ##b##d
注意:
叠词:想要替换重复出现的单词,例如aa bbb cccc
任何的单词都有可能重复,所有使用 .(点)匹配任意字符.然后使用() 括号将该单词封装到组中.
为了重复使用某些规则就将规则封装为了组.使用()
\\1 1 是组号,\\1引用了组.就是组中是什么这个位置也是什么
按照执行规则替换字符串
public static void replaceAll3() { String ss = "aabbbccccd"; String str = ss.replaceAll("(\\w)\\1", "#"); System.out.println(str); } |
案例:
"aabbbccccd" 去掉重复字符 效果: abcd
其实就是将aa替换为a bbb替换为b cccc 替换为c,替换的内容不确定,就需要使用获取组中内容,通过$
public static void replaceAll4() { String ss = "aabbbccccd"; // String str = ss.replaceAll("(.)\\1", "$1");// abbccd String s = str.replaceAll("(.)\\1", "$1"); System.out.println(s); } |
3、Pattern 和Matcher
需求:找到由两个字符组成的单词
“You want to go to high school? Well,I‘d like to, very much, if you think I could.”; 找到由两个字符组成的单词? |
此时需要的是查找的功能,不是简单的匹配检测,可以使用正则类Pattern 的对象
查看API文档: 发现获取Pattern对象的方式:
典型的调用顺序是 Pattern p = Pattern.compile("a*b"); //指定规则创建Pattern对象. Matcher m = p.matcher("aaaaab"); //传入待匹配字符串 boolean b = m.matches(); //验证是否匹配 |
详细说明:
由于String类的功能有限,想要发挥构建功能强大的正则表达式对象.就需要使用 Pattern对象. Pattern对象: 该类位于:java.util.regex包中,通过调用该类的静态方法compile(String regex)获取Pattern对象,(注意:别忘了传入正则规则).该方法会编译传入的正则表达式规则,它会根据你传入的String类型的正则表达式生成一个Pattern对象.接下来 Matcher对象: 将想要检索的字符串传入Pattern对象的matcher() 方法.matcher()方法将生成一个Matcher对象,该对象具备众多功能 例如: boolean find() 查找字符串是否符合规则, String group()返回匹配的结果 |
案例:取出字符串中的两个字符的单词.
String data = "You want to go to high school? Well,I‘d like to, very much, if you think I could."; Pattern pa = Pattern.compile("\\b[a-zA-Z]{2}\\b"); Matcher ma = pa.matcher(data); while (ma.find()) { System.out.println(ma.group()); } |
注意: 这里使用到了正则表达式的边界
\\b[a-zA-Z]{2}\\b
\\b 开头指的是要匹配的开头是单词
[a-zA-Z]{2} 以大小写字母2个
\\b 结尾,匹配的结尾是单词.
注意: \b是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
案例:匹配邮箱
例如: jack@163.com.cn
规则:
邮箱格式要求是:
邮箱开头是字符:[a-zA-Z_0-9]一个或者多个: w+
中间需要有@ 符 :@
@后跟字符:[a-zA-Z_0-9]一个或者多个: w+
. (一个)字符(多个): \\. [a-zA-Z_0-9]+ 它们可以是一个或者多个 (\\w\\d+)+
规则:
\\w+@\\w+(\\.\\w+)+
// 验证邮箱 jack@163.com.cn */ String email = "jack@163.com.cn"; if (email.matches("\\w+@\\w+(\\.\\w+)+")) { System.out.println("合法的邮箱!!!"); } else { System.out.println("不合法"); } |
练习:
银行卡密码校验(6位数字)”\\d{6}”
网站用户名注册 “^[a-zA-Z]\\w*[A-Za-z]{2,3}$”
带区号的固定电话号码”^0\\d{2,3}-\\d{7,8}$”
020-38325125
4、常用的正则表达式
01。^\d+$ // 匹配非负整数(正整数 + 0) 02。^[0-9]*[1-9][0-9]*$ // 匹配正整数 03。^((-\d+)|(0+))$ // 匹配非正整数(负整数 + 0) 04。^-[0-9]*[1-9][0-9]*$ // 匹配负整数 05。^-?\d+$ // 匹配整数 06。^\d+(\.\d+)?$ // 匹配非负浮点数(正浮点数 + 0) 07。^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ // 匹配正浮点数 08。^((-\d+(\.\d+)?)|(0+(\.0+)?))$ //匹配非正浮点数(负浮点数 + 0) 09。^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ // 匹配负浮点数 10。^(-?\d+)(\.\d+)?$ // 匹配浮点数 11。^[A-Za-z]+$ // 匹配由26个英文字母组成的字符串 12。^[A-Z]+$ // 匹配由26个英文字母的大写组成的字符串 13。^[a-z]+$ // 匹配由26个英文字母的小写组成的字符串 14。^[A-Za-z0-9]+$ // 匹配由数字和26个英文字母组成的字符串 15。^\w+$ // 匹配由数字、26个英文字母或者下划线组成的字符串 16。^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ // 匹配email地址 17。^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ // 匹配url 18。匹配中文字符的正则表达式: [\u4e00-\u9fa5] 19。匹配双字节字符(包括汉字在内):[^\x00-\xff] 20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} 21。匹配空行的正则表达式:\n[\s| ]*\r 22。匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 23。匹配首尾空格的正则表达式:(^\s*)|(\s*$) 01、^\S+[a-z A-Z]$ 不能为空 不能有空格 只能是英文字母 02、\S{6,} 不能为空 六位以上 03、^\d+$ 不能有空格 不能非数字 04、(.*)(\.jpg|\.bmp)$ 只能是jpg和bmp格式 05、^\d{4}\-\d{1,2}-\d{1,2}$ 只能是2004-10-22格式 06、^0$ 至少选一项 07、^0{2,}$ 至少选两项 08、^[\s|\S]{20,}$ 不能为空 二十字以上 09、^\+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(\.|\-))+[a-z]{2,6}$ 邮件 10、\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*([,;]\s*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)* 输入多个地址用逗号或空格分隔邮件 11、^(\([0-9]+\))?[0-9]{7,8}$ 电话号码7位或8位或前面有区号例如(022)87341628 12、^[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(\.[a-z A-Z 0-9 _]+)+(\,[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(\.[a-z A-Z 0-9 _]+)+)*$ 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件 13、 ^\w+@\w+(\.\w+)+(\,\w+@\w+(\.\w+)+)*$ 上面表达式也可以写成这样子,更精练。 |