------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
-正则表达式(符合一定规则的表达式)
作用:专门用于操作字符串
特点:用于一些特定的符号来表示一些代码操作
好处:可以简化对字符串的复杂操作
弊端:规则字符定义的越多,越不便阅读,造成阅读性差
具体操作功能:-----参考查看API文档----
1、匹配:String matches()方法;用规则匹配整个字符串,只要有一处不符合规则,则返回false
2、切割:String split()
3、替换:String replaceAll();
4、获取:Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str);
-练习1:对QQ号码进行校验
要求:5-15位,0不能为开头,而且只允许数字
public class Day25_01_Regex {
public static void main(String[] args) {
BufferedReader br = null;
try {
//从键盘获取输入注册号码
System.out.println("请输入注册号码:");
br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null){
String qq = line;
//进行校验
checkQQ2(qq);
}
} catch (Exception e) {
throw new RuntimeException("系统出现问题,暂时不能注销!");
} finally {
//释放资源
if(!(br==null)){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//方法3:通过正则表达式进行校验
public static void checkQQ3(String qq){
String regex = "[1-9][0-9]{4,14}";
boolean flag = qq.matches(regex);
if(flag)
System.out.println("您注册的qq号码为:"+qq);
else
System.out.println("注册的qq号码不正确,请重输!");
}
//方法2:使用Integer.parseInt("123423add342");
//将会产生java.lang.NumberFormatException:异常,从而达到校验目的
public static void checkQQ2(String qq){
int len = qq.length();
if(len>=5 && len<=15){
if(!qq.startsWith("0")){
try {
long l = Long.parseLong(qq);
System.out.println("注册的qq号码为:"+qq);
} catch (NumberFormatException e) {
System.out.println("注册的qq号码不正确,请重输!");
//e.printStackTrace();
}
}
else {
System.out.println("不能以0开头");
}
}
else {
System.out.println("长度不对");
}
}
//方法1:常规判断
public static void checkQQ1(String qq){
int len = qq.length();
if(len>=5 && len<=15){
if(!qq.startsWith("0")){
char[] arr = qq.toCharArray();//将字符串转换为字符数组
boolean flag = true;
for(int i=0;i<arr.length;i++){
if(!(arr[i]>='0' && arr[i]<='9')){
flag = false;
break;
}
}
if(flag){
System.out.println("您注册的qq号码为:"+qq);
}
else{
System.out.println("注册的qq号码不正确,请重输!");
}
}
else {
System.out.println("不能以0开头");
}
}
else {
System.out.println("长度不对");
}
}
}
-正则表达式常用方法
1、匹配:String matches()
2、切割:String split()
3、替换:String replaceAll();
package day25_Regex;
public class Day25_02_RegexDemo {
public static void main(String[] args) {
//=========替换=========
replace();
//=========切割=========
/*
按照叠词进行切割,为了可以让规则的结果被重用,可以将规则用()封装成一个组,组都是
有编号的,从1开始;
想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取
*/
//通过叠词进行切割
//split("zfdfdgddsdsqqerrebfd", "(.)\\1");
//通过点"."进行切割
//split("zhangsan.lisi.wangwu", "\\.");
//通过空格" "进行切割
//split("zhangsan lisi wangwu", " +");
//=========匹配=========
//checkTelNum();
//check();
}
//替换( )
public static void replace(){
String str = "bdafdfffdsagdfdeeeeefswer";
System.out.println(str);
String regex = "(.)\\1+";
String newStr1 = "\\$";//将叠词替换成$
String newStr2 = "$1";//将叠词替换为它本身单个字符
str = str.replaceAll(regex, newStr1);
System.out.println(str);
}
//切割
public static void split(String str, String regex){
String [] arr = str.split(regex);
System.out.println(arr.length);
for(String s : arr){
System.out.println(s);
}
}
//匹配手机号码
public static void checkTelNum(){
String str = "13844336688";
//定义匹配规则
String reg = "1[358]\\d{9}";
boolean b = str.matches(reg);
if(b)
System.out.println("有效手机号码:"+str);
else
System.out.println("无效手机号码: "+str);
}
//匹配下面正则表达式
public static void check(){
String str = "v3843";
String reg = "[a-zA-Z]\\d*";
boolean b = str.matches(reg);
System.out.println(b);
}
}
-正则表达式常见应用——获取
操作步骤:
1、将正则表达式封装成对象
2、让该对象和要操作的字符串相关联
3、关联后,获取正则匹配的引擎
4、通过引擎对符合规则的子字符串进行操作,比如取出
package day25_Regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Day25_05_RegexGet {
public static void main(String[] args) {
getStr();
}
//匹配下面正则表达式
public static void getStr(){
String str = "hao hao xue xi tian tian xiang shang";
System.out.println("原字符串: "+str);
String reg = "\\b[a-zA-Z]{5}\\b";// ----\b 表示单词边界
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
//boolean b = m.find();//将规则作用到字符串上,并进行进行查找符合规则的字符串
//System.out.println(b);
//System.out.println(m.group());//用于获取匹配后结果
System.out.println("matches:"+m.matches());//-----注意!为什么是false?-----
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
}
}
-正则表达式应用——常见的校验
package day25_Regex;
import java.util.TreeSet;
//正则表达式的小练习
public class Day25_06_RegexPractice {
public static void main(String[] args) {
checkMail();
//ipSort();
//test1();
}
//练习3:
public static void checkMail(){
String mail = "hello@outlook.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)";//较为精确的匹配
//reg = "\\w+@\\w+(\\.\\w+)+";//不太精确的匹配
//mail = "1@1.1";
//mail.indexOf("@")!=-1;
System.out.println(mail.matches(reg));
}
//练习2:
//将ip地址(例如:193.22.2.44 11.3.4.22 55.3.44.2 3.111.223.10)进行地址段排序
public static void ipSort(){
String ip = "193.22.2.44 11.3.4.22 55.3.44.2 3.111.223.10";
ip = ip.replaceAll("(\\d+)", "00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip);
String[] arr = ip.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for(String s : arr){
ts.add(s);
}
for(String s : ts){
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}
}
//练习1:
//将"人人人之....之之...初初,性性性..本本本善善善" ---变为"人之初,性本善"
public static void test1(){
String str = "人人人之....之之...初初,性性性..本本本善善善";
//1、先去掉"."
str = str.replaceAll("\\.+", "");
System.out.println(str);
//2、叠词替换为该字符本身
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}