基于正則表達(dá)式詳解:
- 1.專門用于操作字符串的技術(shù)
- 2.而且可以簡(jiǎn)化代碼,用于對(duì)字符串進(jìn)行復(fù)雜操作
- 3.通過(guò)一些符號(hào)的形式,簡(jiǎn)化了代碼的書(shū)寫,其實(shí)底層還是代碼
- 弊端:符號(hào)太多,閱讀性差
正則對(duì)字符串的常見(jiàn)功能操作
- 1.匹配
- 2.切割
- 3.替換
- 4.獲取
package rejexMatches;
import java.util.Scanner;
/**
* 1.1中括號(hào): [判斷字符位上的內(nèi)容]
* 1.2預(yù)定義字符: 都帶有反斜線
* . : 任意字符
* \d : 數(shù)字. [0-9]
* \D :非數(shù)字 [^0-9]
* \w : 單詞字符 [a-z A-Z _0-9]
* 1.3邊界字符
* ^ :行開(kāi)頭
* $ :行結(jié)尾
* \b : 單詞邊界
* 1.4: 數(shù)量詞:必須結(jié)合內(nèi)容
* x? : x內(nèi)容出現(xiàn)零次或一次
* x* : x內(nèi)容出現(xiàn)零次或多次
* x+ : x內(nèi)容出現(xiàn)一次或多次
* x{n} :x內(nèi)容出現(xiàn)n次
* x{n,} : x內(nèi)容至少出現(xiàn)n次
* x{n,m} : x內(nèi)容出現(xiàn)n到m次
*/
public class Matches_demo {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while (true) {
System.out.println("請(qǐng)輸入您的QQ號(hào):");
String str = scan.nextLine();
boolean b = str.matches("\\.+");
if (b) {
System.out.println(str+": 輸入的QQ號(hào)合法");
break;
}else
System.out.println(str + ": 輸入的QQ號(hào)不和法,請(qǐng)重新輸入");
}
}
}
后三種操作
package split_demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SplitDemoString {
public static void main(String[] args) {
String str = "huiehf....sud###suidh..frdgggg.gt.fdd.kkkuhgu..yfdgdtf";
/*
1.匹配(略)
*/
/*
2.切割
*/
splitss(str);
/*
3.替換
*/
replaceString(str);
/*
4.獲取
*/
/**
* Pattern對(duì)象的使用原理
* 1.將正則表達(dá)式字符串編譯成正則對(duì)象
* 2.通過(guò)Pattern對(duì)象獲取Matcher對(duì)象(匹配器對(duì)象)
* 3.通過(guò)匹配器對(duì)象對(duì)字符串進(jìn)行規(guī)劃的匹配,結(jié)果都在匹配器當(dāng)中
* 4.通過(guò)匹配器對(duì)象的功能獲取結(jié)果.
*/
gets(str);
}
private static void gets(String str) {
String sts = "di.shu.hi hd.hdd,iu ,gfu";
String regex = "\\b[a-zA-Z]{3}\\b";
//獲取正則表達(dá)式對(duì)象
Pattern pt = Pattern.compile(regex);
//通過(guò)正則表達(dá)式對(duì)象獲取適配器
Matcher ms = pt.matcher(sts);
//貌似像一個(gè)迭代器 這里是一個(gè)匹配器,如果找到匹配的就輸出,不能找到就繼續(xù)找下一個(gè),直到結(jié)束索引退出循環(huán)
while (ms.find()) {
System.out.println(ms.start() + "----" + ms.group() + "----" + ms.end());
System.out.println(sts.substring(ms.start(), ms.end()));
}
}
private static void replaceString(String str) {
// String replace = str.replaceAll("(.)\\1+","&&");
//在參數(shù)列表中,其他參數(shù)使用之前的參數(shù)中規(guī)則的組,需要使用&組編號(hào)
//將多個(gè)重疊的字符濃縮為一個(gè)字符
// String replace = str.replaceAll("(.)\\1+","$1");
//電話號(hào)碼的隱藏,為了保證公布信息的正確性但是又維護(hù)個(gè)人信息的私密性,也就是防止被人打騷擾電話.
/* String ss="18569146418";
String replace = ss.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
System.out.println(replace);
*/
String ssy = "aiuuf99900nsnudh8978789ynsudhy089897sd";
//郵件網(wǎng)站過(guò)濾 只要出現(xiàn)5個(gè)以上的數(shù)字直接干掉為*** 為了刻意去公布 使用了中國(guó)文字,將無(wú)法過(guò)濾信息
ssy = ssy.replaceAll("\\d{5,}", "***");//比如: 衣二三四巴九零齊齊
System.out.println(ssy);
}
private static void splitss(String str) {
/* String[] strings = str.split("\\.+");
for (String ss:strings) {
System.out.println(ss);
}*/
/* 正則規(guī)則的復(fù)用,想復(fù)用,先封裝,正則封裝用()完成
封裝完成后有編號(hào),從1開(kāi)始,規(guī)則中被()封裝的稱之為組,直接通過(guò)編號(hào)就可以調(diào)用對(duì)應(yīng)的組
調(diào)用方式直接寫已有的組的編號(hào)加上\\
如 : ()\\1.在使用已有的第一組內(nèi)容,原則:先有組,才可以使用對(duì)應(yīng)的編號(hào)調(diào)用組.*/
String[] strings = str.split("(.)\\1+");
for (String ss : strings) {
System.out.println(ss);
}
}
}
案例二
"23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10"
要求:將這些ip地址進(jìn)行排序
package example_1;
import java.util.Arrays;
/**
* 思路:
* 1.將ip通過(guò)空格切割
* 2.對(duì)ip進(jìn)行排序Arrays.sort(),通過(guò)字符串字典順序進(jìn)行排序,這個(gè)順序,這個(gè)順序是錯(cuò)誤的
* 原因: 每個(gè)ip有四塊,每一段最多有三位,每一位不超過(guò)255
* 應(yīng)該按照位數(shù)來(lái)比較才對(duì)
* 因此我們需要將非三位的數(shù)字轉(zhuǎn)換成三位.
* <p>
* 措施:將每個(gè)字段都添加兩個(gè)0,再取后面三位,比較后,打印時(shí)再去掉前面的零.
*/
public class Ip_demo {
public static void main(String[] args) {
String str = "23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10";
//首先需要在每個(gè)字段前面添上兩個(gè)零
str = str.replaceAll("(\\d+)", "00$1");
//獲取最后每個(gè)字段后三位
str = str.replaceAll("0*(\\d{3})", "$1");
//使用.進(jìn)行切割成字符串?dāng)?shù)組
String[] ips = str.split(" +");
//將每個(gè)字符串進(jìn)行升序排列
Arrays.sort(ips);
//循環(huán)遍歷,并在遍歷的同時(shí)將每個(gè)字段前面的零去掉
for (String ss : ips) {
System.out.println(ss.replaceAll("0*(\\d+)", "$1"));
}
}
}
案例三:郵件校驗(yàn)功能
使用正則中的匹配功能
package example_1;
public class ItCast_mail {
public static void main(String[] args) {
/**
* 郵件校驗(yàn)
* 使用正則表達(dá)式中的匹配
*/
String mail = "itcast@2019itcast.cn";
String mails = "422399419@qq.com";
//比較籠統(tǒng)的校驗(yàn)規(guī)則
String regex = "\\w+@\\w+(\\.\\w+)+";
//稍微完整的校驗(yàn)規(guī)則
String regex1 = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3}){1,3}";
boolean b = mail.matches(regex);
boolean b1 = mails.matches(regex1);
System.out.println(mail + "---------" + b);
System.out.println(mails + "---------" + b1);
}
}
基于本地網(wǎng)頁(yè)文件郵箱地址獲取
package java_WangYePaChong;
import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JiYuFile {
public static void main(String[] args) throws IOException {
//創(chuàng)建文件源頭
File file = new File("D:\\Java代碼\\Java進(jìn)階1\\regular01\\src\\java_WangYePaChong\\temple\\hello.html");
//創(chuàng)建正則表達(dá)式源頭
String regex = "\\w+@\\w+(\\.\\w+)+";
//返回郵箱地址集合 可存儲(chǔ)到數(shù)據(jù)庫(kù)中
Set<String> set = fileInMail(file, regex);
//循環(huán)遍歷 后期可以存儲(chǔ)到數(shù)據(jù)庫(kù)中
for (String ss : set) {
System.out.println(ss);
}
}
//基于文件源爬起取
private static Set<String> fileInMail(File file, String regex) throws IOException {
//創(chuàng)建存儲(chǔ)郵箱地址的集合對(duì)象
Set<String> set = new HashSet<>();
//創(chuàng)建正則表達(dá)式對(duì)象荣堰,并將規(guī)則傳入
Pattern p = Pattern.compile(regex);
//獲取字符讀取流對(duì)象
BufferedReader buf = new BufferedReader(new FileReader(file));
String line;
//循環(huán)讀取操作
while ((line = buf.readLine()) != null) {
//使用正則對(duì)象創(chuàng)建匹配器對(duì)象
Matcher m = p.matcher(line);
//如果找到符合regex的萝映,便將符合的字符串存入到集合中
while (m.find()) {
set.add(m.group());
}
}
//返回集合
return set;
}
}
獲取外網(wǎng)的html中的郵箱地址
package java_WangYePaChong;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlWangYeHtml {
public static void main(String[] args) throws IOException {
String str_url = "http://www.downxia.com/zixun/48009.html";
String regex = "\\w+@\\w+(\\.\\w+)+";
//創(chuàng)建url對(duì)象
URL url = new URL(str_url);
//創(chuàng)建基于網(wǎng)頁(yè)爬蟲(chóng)方法
Set<String> set = getMail(url, regex);
for (String ss : set) {
System.out.println(ss);
}
}
private static Set<String> getMail(URL url, String regex) throws IOException {
URLConnection con = url.openConnection();
Pattern p = Pattern.compile(regex);
Set<String> set = new HashSet<>();
BufferedReader buf = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
//循環(huán)讀取操作
while ((line = buf.readLine()) != null) {
//使用正則對(duì)象創(chuàng)建匹配器對(duì)象
Matcher m = p.matcher(line);
//如果找到符合regex的涛浙,便將符合的字符串存入到集合中
while (m.find()) {
set.add(m.group());
}
}
buf.close();
return set;
}
}