一、正则表达式
1、正则表达式使用特殊符号表示,用于操作字符串的一个规则
public class Demo25.1{
public static void main(String[] args) {
//只能输入数字
String str = "124354232";
char[] arr = str.toCharArray();
boolean flag = true;
for (int i = 0; i < arr.length; i++) {
if (!(arr[i] >= 48 && arr[i] <= 57)) {
flag = false;
}
}
System.out.println(flag ? "输入正确" : "输出只能是数字");
//只能输入数字而且长度5-11位
String str2 = "12435423a2";
boolean flag2 = str2.matches("[0-9]\\d{4,10}");
System.out.println(flag2?"输入正确":"非法");
}
}
预定义字符 | 解释 |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
System.out.println("a".matches(".")); //true
System.out.println("1".matches("\\d")); //true
//任何预定义字符没有加上数量词之前都只能匹配一个字符
System.out.println("12".matches("\\d")); //false
System.out.println("%".matches("\\D")); //true
System.out.println("\r".matches("\\s")); //true
System.out.println("^".matches("\\S")); //true
System.out.println("a".matches("\\w")); //true
System.out.println("a".matches("\\W")); //false
数量词 | 解释 |
---|---|
X? | 一次或一次也没有 |
X* | 零次或多次 |
X+ | 一次或多次 |
X{n} | 恰好n次 |
X{n,} | 至少n次 |
X{n,m} | 至少n次,但是不超过m次 |
System.out.println( "a".matches(".") );//true
System.out.println( "a".matches("a") );//true
System.out.println("a".matches("a?") );//true
System.out.println( "aaa".matches("a*") );//true
System.out.println( "".matches("a+") );//false
System.out.println( "aaaaa".matches("a{5}") );//true
System.out.println( "aaaaaaaaaaa".matches("a{5,8}") );//false
System.out.println( "aaa".matches("a{5,}") );//false
System.out.println( "aaaaab".matches("a{5,}") );//true
范围 | 解释 |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
//范围词里面不管有多长,没有数量词搭配只能匹配一个字符
System.out.println( "a".matches("[a]") );//true
System.out.println( "aa".matches("[a]+") );//true
System.out.println( "abc".matches("[abc]{3,}") );//true
System.out.println( "abc".matches("[abc]+") );//true
System.out.println( "dshfshfu1".matches("[^abc]+") );//true
System.out.println( "abcdsaA".matches("[a-z]{5,}") );//false
System.out.println( "abcdsaA12".matches("[a-zA-Z]{5,}") );//true
System.out.println( "abcdsaA12".matches("[a-zA-Z0-9]{5,}") );//true
System.out.println( "abdxyz".matches("[a-cx-z]+"));//false
System.out.println( "bcbcbc".matches("[a-zb-c]{5,}"));//true
System.out.println( "tretrt".matches("[a-z^b-c]{5,}"));//true
2、匹配:matches()
public class Demo25.2{
public static void main(String[] args) {
//需求1:编写一个正则表达式匹配手机号 第一位:1;第二位:3、5、4、7、8;长度:11位
String phone="12345678912";
matchesPhone(phone);
//需求2:编写一个正则表达式匹配固定电话 区号-主机号 区号:首位是0 长度3-4;主机号:首位不是0、长度7-8位
String tel="12345678912";
matchesTel(tel);
}
public static void matchesPhone(String phone){
String reg="1[34578]\\d{9}";
System.out.println( phone.matches(reg)?"合法手机号":"非法手机号");
}
public static void matchesTel(String tel){
String reg="0\\d{2,3}-[1-9]\\d{6,7}";
System.out.println( tel.matches(reg)?"合法固定电话":"非法固定电话");
}
}
3、切割:split()
public class Demo25.3{
public static void main(String[] args) {
//按照空格切割
testPlit1();
//根据重叠词进行切割
testPlit2();
}
public static void testPlit1(){
String str="明 天 放 假";
String[] dates=str.split(" +");
System.out.println("数组的元素:"+Arrays.toString(dates));
}
public static void testPlit2(){
String str="好好学习天天向上";
String[] dates=str.split("(.)\\1+");
//()分组:目的是为了让正则的内容被复用,组号从1开始
System.out.println("数组的元素:"+Arrays.toString(dates));
}
}
4、替换:replaceAll()
public class Demo25.4{
public static void main(String[] args) {
//替换
replaceTest1();
//还原结巴的话
replaceTest2();
}
public static void replaceTest1(){
String str="如有需求请联系12345678912";
String reg="1[34578]\\d{9}";
str=str.replaceAll(reg,"*******");
System.out.println("被替换的号码是:"+str);
}
public static void replaceTest2(){
String str="我我我要要要要学习做做做项目";
String reg="(.)\\1+";
str=str.replaceAll(reg,"$1");//如果需要在replaceAll方法正则的外部引用组的内容,那么要使用"$组号"
System.out.println("被替换的号码是:"+str);
}
}
5、查找:Pattern类(正则对象)、Matcher(匹配器对象)
用法:
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
① 先将正则表达式编译成正则对象,使用的是Pattern类一个静态的方法;
② 让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象;
③ 通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作。
public class Demo25.5{
public static void main(String[] args) {
//匹配器要使用的方法:find();group()
getDemo();
}
public static void getDemo(){
String str = "da jia zhu yi le,ming tian bu fang jia";
//想要获取由3个字母组成的单词
//刚才的功能返回的都是一个结果,只有split返回的是数组,但是它是把规则作为分隔符,不会获取符合规则的内容
String reg = "\\b[a-zA-Z]{3}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.start()+"...."+m.end());
System.out.println("sub:"+str.substring(m.start(),m.end()));
System.out.println(m.group());
}
}
}
6、校验邮箱
public static void checkMail(){
String mail = "abc123@sina.com.cn";
mail = "1@1.1";
String reg = "[a-zA-Z0-9]+@[a-zA-Z0-9]+(\\.[com|cn|net]){1,2}";
reg = "\\w+@\\w+(\\.\\w+)+";//简化的规则。笼统的匹配。
boolean b = mail.matches(reg);
System.out.println(mail+":"+b);
}
7、网络爬虫(网络蜘蛛)
public class Demo25.6{
public static void main(String[] args) throws Exception{
//.cn .com .com.cn .net
String reg = "\\w+@[a-zA-Z]+(\\.[a-zA-Z]+)+";
getMailsByWeb(reg);
}
public static void getMailsByWeb(String regex)throws Exception{
URL url = new URL("http://localhost:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
Pattern p = Pattern.compile(regex);
while((line=bufIn.readLine())!=null){
//System.out.println(line);
Matcher m = p.matcher(line);
while(m.find()){
System.out.println(m.group());
}
}
bufIn.close();
}
public static void getMails(String regex)throws Exception{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String line = null;
Pattern p = Pattern.compile(regex);
while((line=bufr.readLine())!=null){
//System.out.println(line);
Matcher m = p.matcher(line);
while(m.find()){
System.out.println(m.group());
}
}
bufr.close();
}
}