<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
String物件呼叫public String replaceAll(String regex,String replacement)方法,返回一個新的String物件,返回的String物件的字元序列是把當前String物件的字元序列中,所有和引數regex相匹配的子字元序列替換成引數replacement指定的字元序列所得到的字元序列。
例如:
String s1="123hello456"; String s2=s1.replaceAll("\d+","你好。"); //"\d+"是正規表示式,表示一個或多個0~9之間的任意數位 System.out.println(s1);//列印結果為: 123hello456 沒有被改變 System.out.println(s2);//列印結果為: 你好。hello你好。
再如:
String regex="-?[0-9][0-9]*[.]?[0-9]*"; String s1="999大家好,-123.459804明天放假了"; String s2=s1.replaceAll(regex,""); System.out.println("剔除"+s1+"中的數位後得到的字元序列是:"+s2); //剔除999大家好,-123.459804明天放假了中的數位後得到的字元序列是: 大家好, 明天放假了
其實,String類提供了一個實用的方法:
public String[] split(String regex)
當String物件呼叫該方法時,使用引數指定的正規表示式regex作為分隔標記,分解出String物件的字元序列中的單詞,並將分解出的單詞存放在String陣列中。
例如:
//需求:對於一個字元序列,要分解出全部由數位字元組成的單詞。 String s1="1931年9月18日晚,日本發動侵華戰爭,請記住這個日子!"; String regex="\D+"; String s2[]=s1.split(regex); for(String s:s2) System.out.println(s);//分別輸出1931 09 08 ,且可知s2.length()=3;
需要特別注意的是,split方法認為分隔標記的左右是單詞,額外規則是,如果左面的單詞是不含任何字元的字元序列,即為空,則這個字元序列仍然算成一個單詞,但右邊的單詞必須是含有字元的字元序列。
例如:
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陣列長度應該為4而不是3,多出來的空字串是"公元"左側被預設有一個單詞。內容為空。
1.和split()方法不同的是,StringTokenizer物件不使用正規表示式做分隔標記。
2.當分析一個字元序列並將字元序列分解成可被獨立使用的單詞時,可以使用java.util包中的StringTokenizer類,稱該類的物件是一個字元序列的分析器,該類有兩個構造方法。
構造方法1:StringTokenizer(String s):構造一個StringTokenizer物件,例如fenxi。fenxi使用的是預設的分隔標記(空格符,換行符,回車符,Tab符,進紙符(f))分解出引數s的字元序列中的單詞,即這些單詞成為分析中的資料。
構造方法2:StringTokenizer(String s,String delim):構造一個StringTokenizer物件,例如fenxi。fenxi用引數delim的字元序列中的字元的任意排列作為分隔標記,分解出引數s的字元序列中的單詞,即這些單詞成為fenxi中的資料。
注意:分隔標記的任意排列仍然是分隔標記。
3.fenxi可以呼叫String nextToken()方法逐個獲取fenxi中的單詞,每當nextToken()返回一個單詞,fenxi就會自動刪除該單詞。
4.fenxi可以呼叫boolean hasMoreTokens()方法返回一個boolean值,只要fenxi中還有單詞,該方法就返回true,否則返回false。
5.fenxi可以呼叫countToken()方法返回當前fenxi中單詞的個數。
具體範例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+"個"); //輸出結果: we 還剩3個單詞 are 還剩2個單詞 stud 還剩1個單詞 ents 還剩0個單詞 s共有單詞:4個
具體範例2:
String s="市話費:28.39元,長途話費:49.15元,上網費:352元"; String delim="[^0-9.]+";//非數位和.序列都匹配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+"元"); //輸出結果: 28.39 49.15 352.0 總費用:429.53999999999996元
為了建立一個Scanner物件,需要把一個String物件傳遞給所構造的Scanner物件,例如,對於:
String s="telephone cost 876 dollar.Computer cost 2398.89 dollar.";
為了解析出s的字元序列中的數位型單詞,可以如下構造一個Scanner物件:
Scanner scanner=new Scanner(s);
那麼scanner預設使用空格作為分隔標記來解析s的字元序列中的單詞。也可以讓scanner物件呼叫方法:
useDelimiter(正規表示式);
將正規表示式作為分隔標記,即Scanner物件在解析s的字元序列時,把與正規表示式匹配的字元序列作為分隔標記。
Scanner物件解析字元序列的特點如下:
具體範例:
String cost="市話費:28.39元,長途話費:49.15元,上網費: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+"元"); //輸出結果: 28.39 49.15 352.0 總費用:429.53999999999996元
對比:
1. StringTokenizer類和Scanner類都可用於分解字元序列中的單詞,但是二者在思想上有所不同。
2. StringTokenizer類把分解出來的單詞全都放入StringTokenizer物件的實體中,因此StringTokenizer物件能夠快速的獲得單詞,即StringTokenizer物件的實體佔用較多的記憶體(多佔用記憶體,提升速度,相當於把單詞記在大腦中)。
3. 與StringTokenizer類不同的是,Scanner類僅僅存放怎樣獲取單詞的分隔標記,因此scanner物件獲取單詞的速度相對較慢,但scanner物件節省記憶體空間(減慢速度,節省空間,相當於把單詞放在字典裡,大腦只記憶查字典的規則)。
使用Pattern類與Matcher類的步驟如下:
1.使用正規表示式regex作為引數得到一個稱為"模式"的Pattern類的範例pattern。例如
String regex="-?[0-9][0-9]*[.]?[0-9]*"; Pattern pattern=Pattern.compile(regex);
2.模式物件pattern呼叫matcher(CharSequence s)方法返回一個Matcher物件matcher,稱為匹配物件,引數s是matcher要檢索的String物件。
Matcher matcher=pattern.matcher(s);
3.這兩個步驟結束後,匹配物件matcher就可以呼叫各種方法檢索s。
具體方法有:
(1)public boolean find():尋找s的字元序列中和regex匹配的下一子序列。如果成功則返回true,否則返回false。matcher首次呼叫該方法時,尋找s中第一個和regex匹配的子序列,如果find方法返回true,則matcher再呼叫find方法時,就會從上一次匹配成功的子字元序列後開始尋找下一個匹配regex的子字元序列。另外,當find方法返回true時,matcher可以呼叫start()方法和end()方法得到子字元序列在s中的開始位置和結束位置。當find方法返回true時,matcher呼叫group()可以返回find方法本次找到的匹配regex的子字元序列。
(2)public boolean matches():matcher呼叫該方法判斷s的字元序列是否完全和regex匹配。
(3)public boolean lookingAt():matcher呼叫該方法判斷從s的字元序列的開始位置是否有和regex匹配的子字元序列。
(4)public boolean find(int start):matcher呼叫該方法判斷s的字元序列從引數start指定位置開始是否有個regex匹配的子字元序列。當start=0時,該方法和lookingAt()的功能相同。
(5)public String replaceAll(String replacement):matcher呼叫該方法可以返回一個String物件,該String物件的字元序列是通過把s的字元序列中與模式regex匹配的子字元序列全部替換為引數replacement指定的字元序列得到的(注意s本身沒有發生變化)。
(6)public String replaceFirst(String replacement):matcher呼叫該方法可以返回一個String物件,該String物件的字元序列是通過把s的字元序列中第1個與模式regex匹配的子字元序列全部替換為引數replacement指定的字元序列得到的(注意s本身沒有發生變化)。
(7) public String group():返回一個String物件該物件的字元序列是find方法在s的字元序列中找到的匹配regex的子字元序列。
具體範例:
String regex="-?[0-9][0-9]*[.]?[0-9]*";//匹配數位,整數或浮點數的正規表示式 Pattern pattern=Pattern.compile(regex);//初始化模式物件 String s="市話費:28.39元,長途話費:49.15元,上網費: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迴圈一次,算出一個地方的平均氣溫 } System.out.println("三地的平均氣溫:"+Arrays.toString(averTemperture)); //輸出結果為: 從4到9匹配的子序列: 28.39 從16到21匹配的子序列: 49.15 從27到30匹配的子序列: 352 總費用:429.53999999999996元 三地的平均氣溫:[-1.0, 15.5, -18.0]
到此這篇關於Java中字元序列的替換與分解的幾種實現方法的文章就介紹到這了,更多相關Java中字元序列替換與分解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45