正则表达式-字符串基本的匹配,拆分,替换和截取

时间:2023-01-07 18:42:49

如果没有正则表达式,那么字符串的一些操作将会特别困难。

一个手机号的格式为:1、前3位必须为131,150,183,151,137等等;2、必须是11位;3、必须都是数字。

判断一个手机号是否合法,就会有很多的判断语句,将会特别麻烦,这时候就需要正则表达式了。

一、字符串的匹配

String类中有一个Boolean matches(String regex) 方法,用于判断字符串是否合法。用法如下:

public class MatchesDemo {

public static void main(String[] args) {
//定义几个字符串 有合法的手机号和不合法的手机号
String phoneNum1 = "15101234567";//合法
String phoneNum2 = "18301234567";//合法
String wrongNum1 = "151012345670";//多一位
String wrongNum2 = "12301234567";//前三位不挣钱
String wrongNum3 = "1510123456a";//使用了字母
String wrongNum4 = "1510123456";//少一位
checkNum(phoneNum1);
checkNum(phoneNum2);
checkNum(wrongNum1);
checkNum(wrongNum2);
checkNum(wrongNum3);
checkNum(wrongNum4);
}
private static void checkNum(String num){
/*匹配规则的定义,我们加入手机号的号段有:183,151,150
* "((183)|(151)|(150))"表示手机号前三位可以为183或者151或者150
* \\d表示数字,也可以用[0-9]表示
* {8}表示 //d 为8位
* */
String regex = "((183)|(151)|(150))\\d{8}";
if(num.matches(regex)){
System.out.println(num+":合法");
}else{
System.out.println(num+":不合法");
}
}
}

打印结果如下:

正则表达式-字符串基本的匹配,拆分,替换和截取

二、字符串的拆分

如果我们需要将一个字符串如:"编程之美.pdf,大话数据库.pdf,大话数据结构.mobi"拆分成一个数组,对书名分别进行处理,

我们就需要用到String类的String[] split(String regex)方法。

public class SplitDemo {

public static void main(String[] args) {
String books = "编程之美.pdf,大话数据库.pdf,大话数据结构.mobi";
/*
* ((.pdf)|(.mobi))表示前面的字符串为.pdf或者.mobi
* ,? 表示逗号出现一次或没有
*/
String regex = "((.pdf)|(.mobi)),?";
String[] bookArr = books.split(regex);
for(String book:bookArr){
System.out.println("您买的书有:"+book);
}
}

}
打印结果如下:
正则表达式-字符串基本的匹配,拆分,替换和截取

三、字符串的替换

有时候我们确实需要替换字符串,比如我们将文字中某些特征的一些内容去掉。

如:"<span>这些需要替换掉,请替换成:哈哈哈</span>这些不要替换<span>这些需要替换掉</span>"

package com.demo.cc;

public class ReplaceAllDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "<span>这些需要替换掉,请替换成:哈哈哈</span>这些不要替换<span>这些需要替换掉</span>";
/*
* <span>为前缀,</span>是后缀
* .表示任意字符,*表示零次或多次
* ?表示非贪婪模式,默认为贪婪模式
* 贪婪模式会尽可能长的匹配字符串,非贪婪模式尽可能短的匹配字符串
*
*/
//非贪婪模式
String regex1 = "<span>.*?</span>";
//贪婪模式
String regex2 = "<span>.*</span>";

String newStr1 = str.replaceAll(regex1, "哈哈哈");
System.out.println("非贪婪模式匹配:"+newStr1);
String newStr2 = str.replaceAll(regex2, "哈哈哈");
System.out.println("贪婪模式匹配:"+newStr2);

}

}
结果如下:

正则表达式-字符串基本的匹配,拆分,替换和截取

四、字符串的截取

接下来的功能,是要截取字符串中的一段网址,需要用到Pattern类和Matcher类

package com.demo.cc;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatcherDemo {

public static void main(String[] args) {
String str = "我们的网址是:http://blog.csdn.net/w496272885,快来看看吧";
/*
* .表示任意字符,*表示零个或多个,默认使用了贪婪模式。
* \d表示任意数字,也表示截取的最后一位是数字
* 由于\在正则表达式中为特殊字符,所有需要转义,所以使用了\\d
*/
String regex = "http.*\\d";
//这里将正则表达式编译并赋给Pattern类
Pattern pattern = Pattern.compile(regex);
//使用Matcher去保存匹配到的内容,matcher()方法去匹配字符串
Matcher matcher = pattern.matcher(str);
//matcher.find()判断是否有对象,可能匹配到多个,所以使用while循环
while(matcher.find()){
System.out.println(matcher.group());
}

}

}
结果如下:

正则表达式-字符串基本的匹配,拆分,替换和截取

当然,这些都是最基本的操作,更详细的内容,还需要自己去深入挖掘,学海无涯,望多多交流。