Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法
一、使用String類(lèi)
String對(duì)象調(diào)用public String replaceAll(String regex,String replacement)方法,返回一個(gè)新的String對(duì)象,返回的String對(duì)象的字符序列是把當(dāng)前String對(duì)象的字符序列中,所有和參數(shù)regex相匹配的子字符序列替換成參數(shù)replacement指定的字符序列所得到的字符序列。
例如:
String s1="123hello456"; String s2=s1.replaceAll("\\d+","你好。"); //"\\d+"是正則表達(dá)式,表示一個(gè)或多個(gè)0~9之間的任意數(shù)字 System.out.println(s1);//打印結(jié)果為: 123hello456 沒(méi)有被改變 System.out.println(s2);//打印結(jié)果為: 你好。hello你好。
再如:
String regex="-?[0-9][0-9]*[.]?[0-9]*"; String s1="999大家好,-123.459804明天放假了"; String s2=s1.replaceAll(regex,""); System.out.println("剔除"+s1+"中的數(shù)字后得到的字符序列是:"+s2); //剔除999大家好,-123.459804明天放假了中的數(shù)字后得到的字符序列是: 大家好, 明天放假了
其實(shí),String類(lèi)提供了一個(gè)實(shí)用的方法:
public String[] split(String regex)
當(dāng)String對(duì)象調(diào)用該方法時(shí),使用參數(shù)指定的正則表達(dá)式regex作為分隔標(biāo)記,分解出String對(duì)象的字符序列中的單詞,并將分解出的單詞存放在String數(shù)組中。
例如:
//需求:對(duì)于一個(gè)字符序列,要分解出全部由數(shù)字字符組成的單詞。 String s1="1931年9月18日晚,日本發(fā)動(dòng)侵華戰(zhàn)爭(zhēng),請(qǐng)記住這個(gè)日子!"; String regex="\\D+"; String s2[]=s1.split(regex); for(String s:s2) System.out.println(s);//分別輸出1931 09 08 ,且可知s2.length()=3;
需要特別注意的是,split方法認(rèn)為分隔標(biāo)記的左右是單詞,額外規(guī)則是,如果左面的單詞是不含任何字符的字符序列,即為空,則這個(gè)字符序列仍然算成一個(gè)單詞,但右邊的單詞必須是含有字符的字符序列。
例如:
String s1="公元2022年02月18日"; String regex="\\D+"; String s2[]=s1.split(regex); System.out.println(s2.length());//會(huì)編譯報(bào)錯(cuò):Method call expected for(String s:s2) System.out.println(s); //s2[0]= s2[1]=2022 s2[2]=02 s2[3]=18 s1[0]是空的字符串,什么也不會(huì)顯示。 //所以s2數(shù)組長(zhǎng)度應(yīng)該為4而不是3,多出來(lái)的空字符串是"公元"左側(cè)被默認(rèn)有一個(gè)單詞。內(nèi)容為空。
二、使用StringTokenizer類(lèi)
1.和split()方法不同的是,StringTokenizer對(duì)象不使用正則表達(dá)式做分隔標(biāo)記。
2.當(dāng)分析一個(gè)字符序列并將字符序列分解成可被獨(dú)立使用的單詞時(shí),可以使用java.util包中的StringTokenizer類(lèi),稱該類(lèi)的對(duì)象是一個(gè)字符序列的分析器,該類(lèi)有兩個(gè)構(gòu)造方法。
構(gòu)造方法1:StringTokenizer(String s):構(gòu)造一個(gè)StringTokenizer對(duì)象,例如fenxi。fenxi使用的是默認(rèn)的分隔標(biāo)記(空格符,換行符,回車(chē)符,Tab符,進(jìn)紙符(\f))分解出參數(shù)s的字符序列中的單詞,即這些單詞成為分析中的數(shù)據(jù)。
構(gòu)造方法2:StringTokenizer(String s,String delim):構(gòu)造一個(gè)StringTokenizer對(duì)象,例如fenxi。fenxi用參數(shù)delim的字符序列中的字符的任意排列作為分隔標(biāo)記,分解出參數(shù)s的字符序列中的單詞,即這些單詞成為fenxi中的數(shù)據(jù)。
注意:分隔標(biāo)記的任意排列仍然是分隔標(biāo)記。
3.fenxi可以調(diào)用String nextToken()方法逐個(gè)獲取fenxi中的單詞,每當(dāng)nextToken()返回一個(gè)單詞,fenxi就會(huì)自動(dòng)刪除該單詞。
4.fenxi可以調(diào)用boolean hasMoreTokens()方法返回一個(gè)boolean值,只要fenxi中還有單詞,該方法就返回true,否則返回false。
5.fenxi可以調(diào)用countToken()方法返回當(dāng)前fenxi中單詞的個(gè)數(shù)。
具體示例1:
String s="we are stud,ents"; StringTokenizer fenxi=new StringTokenizer(s," ,");//用空格和逗號(hào)的任意組合作為分隔標(biāo)記 int number=fenxi.countToken(); while(fenxi.hasMoreTokens()){ String str=fenxi.nextToken(); System.out.println(str); System.out.println("還剩"+fenxi.countToken()+"個(gè)單詞"); } System.out.println("s共有單詞:"+number+"個(gè)"); //輸出結(jié)果: we 還剩3個(gè)單詞 are 還剩2個(gè)單詞 stud 還剩1個(gè)單詞 ents 還剩0個(gè)單詞 s共有單詞:4個(gè)
具體示例2:
String s="市話費(fèi):28.39元,長(zhǎng)途話費(fèi):49.15元,上網(wǎng)費(fèi):352元"; String delim="[^0-9.]+";//非數(shù)字和.序列都匹配delim s=s.replaceAll(delim,"#"); StringTokenizer fenxi=new StringTokenizer(s,"#"); double totalMoney=0; while(fenxi.hasMoreTokens()){ double money=Double.parseDouble(fenxi.nextToken()); System.out.println(money); totalMoney+=money; } System.out.println("總費(fèi)用:"+totalMoney+"元"); //輸出結(jié)果: 28.39 49.15 352.0 總費(fèi)用:429.53999999999996元
三、使用Scanner類(lèi)
為了創(chuàng)建一個(gè)Scanner對(duì)象,需要把一個(gè)String對(duì)象傳遞給所構(gòu)造的Scanner對(duì)象,例如,對(duì)于:
String s="telephone cost 876 dollar.Computer cost 2398.89 dollar.";
為了解析出s的字符序列中的數(shù)字型單詞,可以如下構(gòu)造一個(gè)Scanner對(duì)象:
Scanner scanner=new Scanner(s);
那么scanner默認(rèn)使用空格作為分隔標(biāo)記來(lái)解析s的字符序列中的單詞。也可以讓scanner對(duì)象調(diào)用方法:
useDelimiter(正則表達(dá)式);
將正則表達(dá)式作為分隔標(biāo)記,即Scanner對(duì)象在解析s的字符序列時(shí),把與正則表達(dá)式匹配的字符序列作為分隔標(biāo)記。
Scanner對(duì)象解析字符序列的特點(diǎn)如下:
- scanner對(duì)象調(diào)用next()方法依次返回s的字符序列中的單詞,如果最后一個(gè)單詞已被next()方法返回,scanner對(duì)象調(diào)用hasNext()將返回false,否則返回true。
- 對(duì)于s的字符序列中的數(shù)字型單詞,例如,12.34等,scanner可以調(diào)用nextInt()或nextDouble()方法來(lái)代替next()方法。即scanner可以調(diào)用nextInt()或nextDouble()方法將數(shù)字型單詞轉(zhuǎn)化為int型或者double型數(shù)據(jù)返回。
- 如果單詞不是數(shù)字型單詞,scanner調(diào)用nextInt()或nextDouble()方法,將會(huì)發(fā)生InputMismatchException異常,在處理異常時(shí)可以調(diào)用next()方法返回該非數(shù)字化單詞。
具體示例:
String cost="市話費(fèi):28.39元,長(zhǎng)途話費(fèi):49.15元,上網(wǎng)費(fèi):352元"; Scanner scanner=new Scanner(cost); scanner.useDelimiter("[^0-9.]+"); double sum=0; while(scanner.hasNext()){ try{ double price=scanner.nextDouble(); sum+=price; System.out.println(price); }catch(InputMismatchException e){ String s=scanner.next(); } } System.out.println("總費(fèi)用:"+sum+"元"); //輸出結(jié)果: 28.39 49.15 352.0 總費(fèi)用:429.53999999999996元
對(duì)比:
1. StringTokenizer類(lèi)和Scanner類(lèi)都可用于分解字符序列中的單詞,但是二者在思想上有所不同。
2. StringTokenizer類(lèi)把分解出來(lái)的單詞全都放入StringTokenizer對(duì)象的實(shí)體中,因此StringTokenizer對(duì)象能夠快速的獲得單詞,即StringTokenizer對(duì)象的實(shí)體占用較多的內(nèi)存(多占用內(nèi)存,提升速度,相當(dāng)于把單詞記在大腦中)。
3. 與StringTokenizer類(lèi)不同的是,Scanner類(lèi)僅僅存放怎樣獲取單詞的分隔標(biāo)記,因此scanner對(duì)象獲取單詞的速度相對(duì)較慢,但scanner對(duì)象節(jié)省內(nèi)存空間(減慢速度,節(jié)省空間,相當(dāng)于把單詞放在字典里,大腦只記憶查字典的規(guī)則)。
四、使用Pattern類(lèi)與Matcher類(lèi)
使用Pattern類(lèi)與Matcher類(lèi)的步驟如下:
1.使用正則表達(dá)式regex作為參數(shù)得到一個(gè)稱為"模式"的Pattern類(lèi)的實(shí)例pattern。例如
String regex="-?[0-9][0-9]*[.]?[0-9]*"; Pattern pattern=Pattern.compile(regex);
2.模式對(duì)象pattern調(diào)用matcher(CharSequence s)方法返回一個(gè)Matcher對(duì)象matcher,稱為匹配對(duì)象,參數(shù)s是matcher要檢索的String對(duì)象。
Matcher matcher=pattern.matcher(s);
3.這兩個(gè)步驟結(jié)束后,匹配對(duì)象matcher就可以調(diào)用各種方法檢索s。
具體方法有:
(1)public boolean find():尋找s的字符序列中和regex匹配的下一子序列。如果成功則返回true,否則返回false。matcher首次調(diào)用該方法時(shí),尋找s中第一個(gè)和regex匹配的子序列,如果find方法返回true,則matcher再調(diào)用find方法時(shí),就會(huì)從上一次匹配成功的子字符序列后開(kāi)始尋找下一個(gè)匹配regex的子字符序列。另外,當(dāng)find方法返回true時(shí),matcher可以調(diào)用start()方法和end()方法得到子字符序列在s中的開(kāi)始位置和結(jié)束位置。當(dāng)find方法返回true時(shí),matcher調(diào)用group()可以返回find方法本次找到的匹配regex的子字符序列。
(2)public boolean matches():matcher調(diào)用該方法判斷s的字符序列是否完全和regex匹配。
(3)public boolean lookingAt():matcher調(diào)用該方法判斷從s的字符序列的開(kāi)始位置是否有和regex匹配的子字符序列。
(4)public boolean find(int start):matcher調(diào)用該方法判斷s的字符序列從參數(shù)start指定位置開(kāi)始是否有個(gè)regex匹配的子字符序列。當(dāng)start=0時(shí),該方法和lookingAt()的功能相同。
(5)public String replaceAll(String replacement):matcher調(diào)用該方法可以返回一個(gè)String對(duì)象,該String對(duì)象的字符序列是通過(guò)把s的字符序列中與模式regex匹配的子字符序列全部替換為參數(shù)replacement指定的字符序列得到的(注意s本身沒(méi)有發(fā)生變化)。
(6)public String replaceFirst(String replacement):matcher調(diào)用該方法可以返回一個(gè)String對(duì)象,該String對(duì)象的字符序列是通過(guò)把s的字符序列中第1個(gè)與模式regex匹配的子字符序列全部替換為參數(shù)replacement指定的字符序列得到的(注意s本身沒(méi)有發(fā)生變化)。
(7) public String group():返回一個(gè)String對(duì)象該對(duì)象的字符序列是find方法在s的字符序列中找到的匹配regex的子字符序列。
具體示例:
String regex="-?[0-9][0-9]*[.]?[0-9]*";//匹配數(shù)字,整數(shù)或浮點(diǎn)數(shù)的正則表達(dá)式 Pattern pattern=Pattern.compile(regex);//初始化模式對(duì)象 String s="市話費(fèi):28.39元,長(zhǎng)途話費(fèi):49.15元,上網(wǎng)費(fèi):352元"; Matcher matcher=pattern.matcher(s);//初始化匹配對(duì)象,用于檢索s double sum=0; while(matcher.find()){ String str=matcher.group(); sum+=Double.parseDouble(str); System.out.println("從"+matcher.start()+"到"+matcher.end()+"匹配的子序列:"); System.out.println(str); } System.out.println("總費(fèi)用:"+sum+"元"); String weatherForecast[]={"北京:-9度至7度","廣州:10度至21度","哈爾濱:-29度至-7度"};//存放三地的溫度 double averTemperture[]=new double[weatherForecast.length];//存放三地的平均溫度 for(int i=0;i<weatherForecast.length;i++){ Matcher matcher1=pattern.matcher(weatherForecast[i]);//初始化匹配對(duì)象,模式不變 double sum1=0; int count=0; while(matcher1.find()){ count++;//一個(gè)地方有幾個(gè)氣溫,count就加幾次 sum1+=Double.parseDouble(matcher1.group()); //sum1表示的是一個(gè)地方最高氣溫與最低氣溫的和 } averTemperture[i]=sum1/count;//for循環(huán)一次,算出一個(gè)地方的平均氣溫 } System.out.println("三地的平均氣溫:"+Arrays.toString(averTemperture)); //輸出結(jié)果為: 從4到9匹配的子序列: 28.39 從16到21匹配的子序列: 49.15 從27到30匹配的子序列: 352 總費(fèi)用:429.53999999999996元 三地的平均氣溫:[-1.0, 15.5, -18.0]
到此這篇關(guān)于Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java中字符序列替換與分解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何實(shí)現(xiàn)圖片裁剪預(yù)覽功能
通常注冊(cè)賬戶上傳用戶圖像時(shí)需要進(jìn)行預(yù)覽,這篇文章就是教我們?nèi)绾斡?Java 實(shí)現(xiàn)圖片裁剪預(yù)覽功能,需要的朋友可以參考下2015-07-07SpringCloud網(wǎng)關(guān)組件Gateway原理深度解析
Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,一些基礎(chǔ)的請(qǐng)求預(yù)處理的邏輯可以統(tǒng)一實(shí)現(xiàn)在網(wǎng)關(guān)這一層,這樣業(yè)務(wù)服務(wù)只需要專注于處理業(yè)務(wù)邏輯即可,所以本文就帶大家深度解析網(wǎng)關(guān)組件Gateway,需要的朋友可以參考下2023-07-07SpringBoot、Java 使用 Jsoup 解析 HTML 頁(yè)面
這篇文章主要介紹了SpringBoot、Java 使用 Jsoup 解析 HTML 頁(yè)面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問(wèn)題及解決
這篇文章主要介紹了IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12springboot臨時(shí)文件存儲(chǔ)目錄配置方式
這篇文章主要介紹了springboot臨時(shí)文件存儲(chǔ)目錄配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07