day52-正则表达式03( 三 )


day52-正则表达式03

文章插图
5.8.3判断String类 public boolean matches(String regex)
验证一个手机号码,要求必须是以138、139开头的
package li.regexp;//匹配public class RegExp14 {public static void main(String[] args) {//验证一个手机号码,要求必须是以138、139开头的十一位数字String content="13899988880";if (content.matches("13[89]\\d{8}")) {//matches是整体匹配,不用加定位符System.out.println("验证成功");}else {System.out.println("验证失败");}}}
day52-正则表达式03

文章插图
5.8.3分割String类 public String[] split(String regex)
例子
有如下字符串,要求按照#或者-或者~或者数字来分割
“hello#abc-jack12smith~北京”
package li.regexp;//分割public class RegExp14 {public static void main(String[] args) {//要求按照# 或者- 或者~ 或者数字 来分割String content = "hello#abc-jack12smith~北京";String[] split = content.split("#|-|~|\\d+");for (int i = 0; i < split.length; i++) {System.out.println(split[i]);}}}
day52-正则表达式03

文章插图
5.9本章习题5.9.1验证电子邮件格式规定电子邮件格式为:
  1. 只能有一个@
  2. @前面是用户名,可以是a-z A-Z 0-9_-字符
  3. @后面是域名,并且域名只能是英文字母 , 比如 shouhu.com 或者 tsinghua.org.cn
  4. 写出对应的正则表达式 , 验证输入的字符串是否满足规则
package li.regexp;public class Homework01 {public static void main(String[] args) {String content = "olien@tsinghua.org.cn";//因此,String 的 marches方法是整体匹配,不用加定位符 , 但是建议加上if (content.matches("^[\\w-]+@([a-zA-z]+\\.)+[a-zA-z]+$")) {System.out.println("匹配成功");} else {System.out.println("匹配失败");}}}
day52-正则表达式03

文章插图
源码分析:
  1. 点击matches方法,可以看到String的marches方法:
public boolean matches(String regex) {return Pattern.matches(regex, this);}
  1. 再点击return的Pattern.matches方法:
public static boolean matches(String regex, CharSequence input) {Pattern p = Pattern.compile(regex);Matcher m = p.matcher(input);return m.matches();}
  1. m.matches()方法:
/** * Attempts to match the entire region against the pattern.-尝试将整个区域与模式匹配 */public boolean matches() {return match(from, ENDANCHOR);}因此,String 的 marches方法是整体匹配,不用加定位符 , 但是建议加上
5.9.2验证整数或者小数要求验证是不是整数或者小数
提示:这个题要考虑整数和负数
比如:123,-345,34.89,-87.0,-0.01,0.45等
package li.regexp;public class Homework02 {public static void main(String[] args) {//要求验证是不是整数或者小数//提示:这个题要考虑整数和负数//比如:123 , -345,34.89,-87.0,-0.01,0.45等/*** 思路:* 1.先写出简单的正则表达式* 2.再根据各种情况逐步地完善* 2.1 [-+]? 考虑的是符号* 2.2 小数点以及小数点后面的数字可以用 (\\.\\d+)?* 2.3 小数点前面的应该存在数字,且分为两种情况:*2.3.1情况一:第一个应该以1-9开头,剩下的可能有0到多个数字 ,  ([1-9]\\d*)*2.3.2情况二:小数点前面只有一位数字0*两种情况整合起来就是([1-9]\\d*|0)*/String content = "-09.9";//"^[-+]?([1-9]\\d*|0)(\\.\\d+)?$"if (content.matches("^[-+]?([1-9]\\d*|0)(\\.\\d+)?$")) {System.out.println("验证成功-是整数或者小数");} else {System.out.println("验证失败-不是整数或者小数");}}}
day52-正则表达式03

文章插图
5.9.3解析URL对一个url进行解析 http://www.shhu.com:8080/abc/index.htm
  1. 要求得到协议是什么http
  2. 域名是什么www.shhu.com
  3. 端口是什么8080
  4. 文件名是什么index.htm
思路:分组 , 4组,分别获取到对应的值
day52-正则表达式03

文章插图
package li.regexp;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Homework03 {public static void main(String[] args) {String content = "http://www.shhu.com:8080/abc/de/fgh/index.htm";//如果名称中要求有特殊符号,就将特殊符号加入到中括号中String regStr = "^([a-zA-Z]+)://([a-zA-Z.]+):(\\d+)[\\w-/]*/([\\w.]+)$";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);if (matcher.matches()) {//整体匹配,如果匹配成功,可以通过group(x),获取对应分组的内容System.out.println("整体匹配=" + matcher.group(0));System.out.println("协议=" + matcher.group(1));System.out.println("域名=" + matcher.group(2));System.out.println("端口=" + matcher.group(3));System.out.println("文件名=" + matcher.group(4));} else {System.out.println("没有匹配成功");}}}

推荐阅读