最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中字符序列的替換與分解的幾種實現(xiàn)方法

 更新時間:2022年02月20日 11:34:25   作者:炎貝的  
本文主要介紹了Java中字符序列的替換與分解的幾種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、使用String類

String對象調(diào)用public String replaceAll(String regex,String replacement)方法,返回一個新的String對象,返回的String對象的字符序列是把當前String對象的字符序列中,所有和參數(shù)regex相匹配的子字符序列替換成參數(shù)replacement指定的字符序列所得到的字符序列。

例如:

String s1="123hello456";
String s2=s1.replaceAll("\\d+","你好。"); //"\\d+"是正則表達式,表示一個或多個0~9之間的任意數(shù)字
System.out.println(s1);//打印結(jié)果為: 123hello456    沒有被改變
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ù)字后得到的字符序列是: 大家好, 明天放假了

其實,String類提供了一個實用的方法:

public String[] split(String regex)

當String對象調(diào)用該方法時,使用參數(shù)指定的正則表達式regex作為分隔標記,分解出String對象的字符序列中的單詞,并將分解出的單詞存放在String數(shù)組中。

例如:

//需求:對于一個字符序列,要分解出全部由數(shù)字字符組成的單詞。
String s1="1931年9月18日晚,日本發(fā)動侵華戰(zhàn)爭,請記住這個日子!";
String regex="\\D+";
String s2[]=s1.split(regex);
for(String s:s2)
System.out.println(s);//分別輸出1931  09  08 ,且可知s2.length()=3;

需要特別注意的是,split方法認為分隔標記的左右是單詞,額外規(guī)則是,如果左面的單詞是不含任何字符的字符序列,即為空,則這個字符序列仍然算成一個單詞,但右邊的單詞必須是含有字符的字符序列。
例如:

String s1="公元2022年02月18日";
String regex="\\D+";
String s2[]=s1.split(regex);
System.out.println(s2.length());//會編譯報錯:Method call expected 
for(String s:s2)
System.out.println(s);
//s2[0]=  s2[1]=2022 s2[2]=02  s2[3]=18  s1[0]是空的字符串,什么也不會顯示。
//所以s2數(shù)組長度應(yīng)該為4而不是3,多出來的空字符串是"公元"左側(cè)被默認有一個單詞。內(nèi)容為空。

二、使用StringTokenizer類

1.和split()方法不同的是,StringTokenizer對象不使用正則表達式做分隔標記。
2.當分析一個字符序列并將字符序列分解成可被獨立使用的單詞時,可以使用java.util包中的StringTokenizer類,稱該類的對象是一個字符序列的分析器,該類有兩個構(gòu)造方法。
構(gòu)造方法1:StringTokenizer(String s):構(gòu)造一個StringTokenizer對象,例如fenxi。fenxi使用的是默認的分隔標記(空格符,換行符,回車符,Tab符,進紙符(\f))分解出參數(shù)s的字符序列中的單詞,即這些單詞成為分析中的數(shù)據(jù)。
構(gòu)造方法2:StringTokenizer(String s,String delim):構(gòu)造一個StringTokenizer對象,例如fenxi。fenxi用參數(shù)delim的字符序列中的字符的任意排列作為分隔標記,分解出參數(shù)s的字符序列中的單詞,即這些單詞成為fenxi中的數(shù)據(jù)。
注意:分隔標記的任意排列仍然是分隔標記。
3.fenxi可以調(diào)用String nextToken()方法逐個獲取fenxi中的單詞,每當nextToken()返回一個單詞,fenxi就會自動刪除該單詞。
4.fenxi可以調(diào)用boolean hasMoreTokens()方法返回一個boolean值,只要fenxi中還有單詞,該方法就返回true,否則返回false。
5.fenxi可以調(diào)用countToken()方法返回當前fenxi中單詞的個數(shù)。

具體示例1:

String s="we are stud,ents";
StringTokenizer fenxi=new StringTokenizer(s," ,");//用空格和逗號的任意組合作為分隔標記
int number=fenxi.countToken();
while(fenxi.hasMoreTokens()){
String str=fenxi.nextToken();
System.out.println(str);
System.out.println("還剩"+fenxi.countToken()+"個單詞");
}
System.out.println("s共有單詞:"+number+"個");
//輸出結(jié)果:
we
還剩3個單詞
are
還剩2個單詞
stud
還剩1個單詞
ents
還剩0個單詞
s共有單詞:4個

具體示例2:

String s="市話費:28.39元,長途話費:49.15元,上網(wǎng)費: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("總費用:"+totalMoney+"元");
//輸出結(jié)果:
28.39
49.15
352.0
總費用:429.53999999999996元

三、使用Scanner類

為了創(chuàng)建一個Scanner對象,需要把一個String對象傳遞給所構(gòu)造的Scanner對象,例如,對于:

String s="telephone cost 876 dollar.Computer cost 2398.89 dollar.";

為了解析出s的字符序列中的數(shù)字型單詞,可以如下構(gòu)造一個Scanner對象:

Scanner scanner=new Scanner(s);

那么scanner默認使用空格作為分隔標記來解析s的字符序列中的單詞。也可以讓scanner對象調(diào)用方法:

useDelimiter(正則表達式);

將正則表達式作為分隔標記,即Scanner對象在解析s的字符序列時,把與正則表達式匹配的字符序列作為分隔標記。
Scanner對象解析字符序列的特點如下:

  • scanner對象調(diào)用next()方法依次返回s的字符序列中的單詞,如果最后一個單詞已被next()方法返回,scanner對象調(diào)用hasNext()將返回false,否則返回true。
  • 對于s的字符序列中的數(shù)字型單詞,例如,12.34等,scanner可以調(diào)用nextInt()或nextDouble()方法來代替next()方法。即scanner可以調(diào)用nextInt()或nextDouble()方法將數(shù)字型單詞轉(zhuǎn)化為int型或者double型數(shù)據(jù)返回。
  • 如果單詞不是數(shù)字型單詞,scanner調(diào)用nextInt()或nextDouble()方法,將會發(fā)生InputMismatchException異常,在處理異常時可以調(diào)用next()方法返回該非數(shù)字化單詞。

具體示例:

String cost="市話費:28.39元,長途話費:49.15元,上網(wǎng)費: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("總費用:"+sum+"元");
//輸出結(jié)果:
28.39
49.15
352.0
總費用:429.53999999999996元

對比:

1. StringTokenizer類和Scanner類都可用于分解字符序列中的單詞,但是二者在思想上有所不同。

2. StringTokenizer類把分解出來的單詞全都放入StringTokenizer對象的實體中,因此StringTokenizer對象能夠快速的獲得單詞,即StringTokenizer對象的實體占用較多的內(nèi)存(多占用內(nèi)存,提升速度,相當于把單詞記在大腦中)。

3. 與StringTokenizer類不同的是,Scanner類僅僅存放怎樣獲取單詞的分隔標記,因此scanner對象獲取單詞的速度相對較慢,但scanner對象節(jié)省內(nèi)存空間(減慢速度,節(jié)省空間,相當于把單詞放在字典里,大腦只記憶查字典的規(guī)則)。

四、使用Pattern類與Matcher類

使用Pattern類與Matcher類的步驟如下:

1.使用正則表達式regex作為參數(shù)得到一個稱為"模式"的Pattern類的實例pattern。例如

String regex="-?[0-9][0-9]*[.]?[0-9]*";
Pattern pattern=Pattern.compile(regex);

2.模式對象pattern調(diào)用matcher(CharSequence s)方法返回一個Matcher對象matcher,稱為匹配對象,參數(shù)s是matcher要檢索的String對象。

Matcher matcher=pattern.matcher(s);

3.這兩個步驟結(jié)束后,匹配對象matcher就可以調(diào)用各種方法檢索s。

具體方法有:

(1)public boolean find():尋找s的字符序列中和regex匹配的下一子序列。如果成功則返回true,否則返回false。matcher首次調(diào)用該方法時,尋找s中第一個和regex匹配的子序列,如果find方法返回true,則matcher再調(diào)用find方法時,就會從上一次匹配成功的子字符序列后開始尋找下一個匹配regex的子字符序列。另外,當find方法返回true時,matcher可以調(diào)用start()方法和end()方法得到子字符序列在s中的開始位置和結(jié)束位置。當find方法返回true時,matcher調(diào)用group()可以返回find方法本次找到的匹配regex的子字符序列。
(2)public boolean matches():matcher調(diào)用該方法判斷s的字符序列是否完全和regex匹配。
(3)public boolean lookingAt():matcher調(diào)用該方法判斷從s的字符序列的開始位置是否有和regex匹配的子字符序列。
(4)public boolean find(int start):matcher調(diào)用該方法判斷s的字符序列從參數(shù)start指定位置開始是否有個regex匹配的子字符序列。當start=0時,該方法和lookingAt()的功能相同。
(5)public String replaceAll(String replacement):matcher調(diào)用該方法可以返回一個String對象,該String對象的字符序列是通過把s的字符序列中與模式regex匹配的子字符序列全部替換為參數(shù)replacement指定的字符序列得到的(注意s本身沒有發(fā)生變化)。
(6)public String replaceFirst(String replacement):matcher調(diào)用該方法可以返回一個String對象,該String對象的字符序列是通過把s的字符序列中第1個與模式regex匹配的子字符序列全部替換為參數(shù)replacement指定的字符序列得到的(注意s本身沒有發(fā)生變化)。
(7) public String group():返回一個String對象該對象的字符序列是find方法在s的字符序列中找到的匹配regex的子字符序列。

具體示例:

String regex="-?[0-9][0-9]*[.]?[0-9]*";//匹配數(shù)字,整數(shù)或浮點數(shù)的正則表達式
Pattern pattern=Pattern.compile(regex);//初始化模式對象
String s="市話費:28.39元,長途話費:49.15元,上網(wǎng)費:352元";
Matcher matcher=pattern.matcher(s);//初始化匹配對象,用于檢索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("總費用:"+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]);//初始化匹配對象,模式不變
double sum1=0;
int count=0;
while(matcher1.find()){
count++;//一個地方有幾個氣溫,count就加幾次
sum1+=Double.parseDouble(matcher1.group()); //sum1表示的是一個地方最高氣溫與最低氣溫的和
}
averTemperture[i]=sum1/count;//for循環(huán)一次,算出一個地方的平均氣溫
}
System.out.println("三地的平均氣溫:"+Arrays.toString(averTemperture));
//輸出結(jié)果為:
從4到9匹配的子序列:
28.39
從16到21匹配的子序列:
49.15
從27到30匹配的子序列:
352
總費用:429.53999999999996元
三地的平均氣溫:[-1.0, 15.5, -18.0]

到此這篇關(guān)于Java中字符序列的替換與分解的幾種實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java中字符序列替換與分解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA設(shè)計模式中的策略模式你了解嗎

    JAVA設(shè)計模式中的策略模式你了解嗎

    這篇文章主要為大家詳細介紹了JAVA設(shè)計模式中的策略模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Nacos注冊中心的幾種調(diào)用方式詳解

    Nacos注冊中心的幾種調(diào)用方式詳解

    Spring Cloud Alibaba Nacos 作為近幾年最熱門的注冊中心和配置中心,也被國內(nèi)無數(shù)公司所使用,本文就來看下 Nacos 作為注冊中心時,調(diào)用它的接口有幾種方式
    2023-10-10
  • JavaApi實現(xiàn)更新刪除及讀取節(jié)點

    JavaApi實現(xiàn)更新刪除及讀取節(jié)點

    這篇文章主要介紹了JavaApi實現(xiàn)更新刪除及讀取節(jié)點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java目錄樹的創(chuàng)建與獲取

    Java目錄樹的創(chuàng)建與獲取

    在Java開發(fā)中,經(jīng)常會涉及到生成目錄樹的需求,本文主要介紹了Java目錄樹的創(chuàng)建與獲取,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • Java中初始化List的5種方法示例

    Java中初始化List的5種方法示例

    這篇文章主要給大家介紹了關(guān)于Java中初始化List的5種方法,文中通過示例代碼介紹的非常詳細,對大家學習或使用java具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • spring mvc 實現(xiàn)獲取后端傳遞的值操作示例

    spring mvc 實現(xiàn)獲取后端傳遞的值操作示例

    這篇文章主要介紹了spring mvc 實現(xiàn)獲取后端傳遞的值操作,結(jié)合實例形式詳細分析了spring mvc使用JSTL 方法獲取后端傳遞的值相關(guān)操作技巧
    2019-11-11
  • 淺析Spring IOC 依賴查找你需要知道的幾種方式

    淺析Spring IOC 依賴查找你需要知道的幾種方式

    這篇文章主要介紹了淺析Spring IOC 依賴查找的幾種方式,Spring是Java面試中最常考的,學Java的小伙伴快來看看吧
    2021-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解

    在之前的學習中,我們主要了解了很多 Java 的 基本語法,但是在之后的 Java學習中,了解基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的知識非常重要,數(shù)據(jù)結(jié)構(gòu)的思想可以幫助我們更加清晰明白的了解 Java 的解題思路等等.今天我們就來開始學習實現(xiàn)一個Java基礎(chǔ)的單鏈表,需要的朋友可以參考下
    2021-05-05
  • springboot yml配置文件使用@project.xxxx@啟動報錯Do not use @ for indentation問題

    springboot yml配置文件使用@project.xxxx@啟動報錯Do not 

    這篇文章主要介紹了springboot yml配置文件使用@project.xxxx@啟動報錯Do not use @ for indentation問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 基于HttpClient上傳文件中文名亂碼的解決

    基于HttpClient上傳文件中文名亂碼的解決

    這篇文章主要介紹了HttpClient上傳文件中文名亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07

最新評論

锦屏县| 吉木乃县| 滁州市| 保康县| 东山县| 和顺县| 江门市| 叶城县| 林西县| 肃北| 常山县| 海盐县| 湖南省| 会东县| 郴州市| 怀集县| 桓台县| 桃源县| 白山市| 鄂伦春自治旗| 光山县| 长子县| 高清| 曲阳县| 琼结县| 黄山市| 广河县| 邓州市| 南召县| 兴和县| 老河口市| 高平市| 泰州市| 璧山县| 滦南县| 麻江县| 肃北| 象山县| 英德市| 藁城市| 郎溪县|