课后练习
1,多種方式判斷字符串"mingrikejijavabu"中字符‘i’出現(xiàn)的次數(shù)
package com.hanqi;
public class Number {
public static void main(String[] args) {
String num=new String("mingrikejijavabu");
System.out.println("原始字符串:"+num);
//第一種方法
int b=0;
for(int a=0;a<num.length();a++)
{
if(num.charAt(a)=='i')
{
b++;
}
}
System.out.println("第一種方法 i出現(xiàn)的次數(shù):" +b);
//第二種方法
String[] str=new String[]{"m","i","n","g","r","i","k","e","j","i","j","a","v","a","b","u"};
int sum=0;
System.out.print("原始數(shù)據(jù):");
for(String t: str)
{
System.out.print(t);
}
System.out.println("");
for(int a=0;a<str.length;a++)
{
if(str[a]=="i")
{
sum+=1;
}
}
System.out.println("第二種方法 i出現(xiàn)的次數(shù):" +sum);
}
}
判斷字符串中某個(gè)字符出現(xiàn)的次數(shù)
2、用for循環(huán)和if循環(huán)語(yǔ)句去除空格
package com.hanqi;
public class zuoye1 {
public static void main(String[] args) {
String str=new String(" 張 三 王 五 ");
System.out.println("原始字符串:" +str);
System.out.println("原始字符串長(zhǎng)度:" +str.length());
int m=0;
char[] str1=new char[str.length()-m];
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)!=' ')
{
for(int j=i;j<=i;j++)
{
str1[j-m]=str.charAt(i);
}
}
else
{
for(int j=i;j<=i;j++)
{
m++;
}
}
}
String str2=new String(str1);
//System.out.println("m=" +m);
System.out.println("除去空格后字符串:"+str2.substring(0, str.length()-m));
System.out.println("處理后字符串長(zhǎng)度:"+str2.substring(0, str.length()-m).length());
}
}
用for循環(huán)和if循環(huán)語(yǔ)句去除空格
3、多種方法實(shí)現(xiàn)字符串"我是中國(guó)人,我是山東人"中是否是"山東人"結(jié)尾
package com.hanqi;
public class zuoye {
public static void main(String[] args) {
String str=new String("我是中國(guó)人,我是山東人");
System.out.println("原始字符串:" +str);
//第一種方法
System.out.println("第一種方法輸出結(jié)果:" +str.endsWith("山東人"));
//第二種方法
System.out.println("第二種方法輸出結(jié)果:" +(str.indexOf("山東人")==str.length()-3));
//第三種方法
System.out.println("第三種方法輸出結(jié)果:" +(str.charAt(str.length()-3)=='山' &&
str.charAt(str.length()-2)=='東'&& str.charAt(str.length()-1)=='人'));
//第四種方法
System.out.println("第四種方法輸出結(jié)果:" +(str.substring(str.length()-3, str.length())).equals("山東人"));
}
}
多種方法判斷結(jié)尾字符
4、正則表達(dá)式
正則表達(dá)式(Regular Expressions)可不是Java的專利,很多的語(yǔ)言像Perl,Python,PHP,Ruby等等都支持正則表達(dá)式,正則表達(dá)式是字符串處理的利器,它是一種描述字符串模式的式子,一個(gè)正則表達(dá)式的核心價(jià)值就是匹配一個(gè)字符串。各個(gè)語(yǔ)言實(shí)現(xiàn)的正則表達(dá)式引擎并不完全相同,Oreilly出版的《精通正則表達(dá)式》是講解正則表達(dá)式的經(jīng)典教程。這里只是總結(jié)下Java中的正則表達(dá)式的相關(guān)知識(shí),Java中的正則表達(dá)式功能是通過(guò)java.util.regex包中的兩個(gè)類來(lái)實(shí)現(xiàn)的:Pattern類,定義了封裝了正則表達(dá)式的對(duì)象;Matcher類,它定義了封裝了一個(gè)狀態(tài)機(jī)的對(duì)象,這個(gè)狀態(tài)機(jī)可以使用一個(gè)給定的Pattern對(duì)象搜索一個(gè)特定的字符串。這個(gè)包里還定義了PatternSyntaxException類,如果編譯正則表達(dá)式創(chuàng)建Pattern對(duì)象時(shí)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,將拋出異常。正則表達(dá)式也是個(gè)字符串,一般會(huì)把它封裝到一個(gè)Pattern對(duì)象里,某些簡(jiǎn)單的情況下,完全可以不用regex包,只用String類的matches()就可以判斷該字符串是否和正則表達(dá)式匹配。例如:
"one piece".matches("one.*");//true
使用java中的正則式基本上很簡(jiǎn)單:
(1)把一個(gè)包含正則表達(dá)式的字符串傳給Pattern類的靜態(tài)方法compile()來(lái)創(chuàng)建一個(gè)Pattern對(duì)象。
(2)然后通過(guò)調(diào)用Pattern對(duì)象的matcher()方法,并把要被搜索的字符串作為實(shí)參以獲得一個(gè)Matcher對(duì)象。
(3)調(diào)用Matcher對(duì)象的find()方法來(lái)搜索字符串。
(4)如果找到了這個(gè)模式串,可以查詢Matcher對(duì)象以找出該模式串在字符串的什么位置以及與其匹配的相關(guān)的其他信息。
上面這4步是《Java2 入門經(jīng)典》---Ivor Horton 這本書里講的,這些步驟指引了我們?cè)趺磥?lái)學(xué)正則表達(dá)式:1.最核心的東西就是正則表達(dá)式的編寫,也就是說(shuō)掌握正則表達(dá)式語(yǔ)法來(lái)寫出想匹配的字符串的模式,比如說(shuō)要匹配一個(gè)email地址,怎么來(lái)寫正則式。2.弄明白matcher(),find(),compile()等方法的作用,其實(shí)就是查API,看這些方法參數(shù)是啥,返回值是啥,作用是啥。3.關(guān)于正則表達(dá)式的編程都是按照某些步驟來(lái)做的,按要求步步為營(yíng)即可。現(xiàn)在學(xué)習(xí)套路很明確了,簡(jiǎn)單的說(shuō)就是:掌握語(yǔ)法—>弄懂方法—>遵循步驟。
下面先說(shuō)第一步,Java中正則表達(dá)式的語(yǔ)法,這里就是理清語(yǔ)法的脈絡(luò),具體的語(yǔ)法都是點(diǎn)到為止,因?yàn)閎aidu,維基等搜索引擎就可以直接搜到關(guān)于正則式語(yǔ)法的詳細(xì)講解。正則表達(dá)式的語(yǔ)法要素有以下這些:常規(guī)字符,字符類(字符集合),通配符,量詞,邊界匹配符,運(yùn)算符,組,標(biāo)志序列。結(jié)合例子來(lái)幫助理清正則表達(dá)式語(yǔ)法的脈絡(luò)。
比如說(shuō)有一個(gè)字符串"0310handan",我們要寫一個(gè)正則式來(lái)描述這個(gè)字符串,最簡(jiǎn)單的怎么做呢?就寫0310handan(查API會(huì)看到方法compile的參數(shù)是String regex,正則表達(dá)式是以字符串的形式給出來(lái)的,但就其本身來(lái)說(shuō)并不是字符串,這里為了突出正則表達(dá)式的語(yǔ)法特性,所以都不帶引號(hào)),這就是常規(guī)字符的用處,常規(guī)字符按其字面含義匹配。要都這么干的話這個(gè)正則表達(dá)式就是一一映射了,一個(gè)字符串對(duì)應(yīng)一個(gè)正則表達(dá)式,我們說(shuō)正則表達(dá)式是描述字符串的利器,這就意味著兩點(diǎn):1.一個(gè)正則表達(dá)式能描述多個(gè)甚至是無(wú)限多個(gè)字符串,這反映了它描述功能強(qiáng)大。2.一個(gè)字符串可以被表示成多個(gè)正則表達(dá)式,這反映了它的靈活。因?yàn)榧葟?qiáng)大又靈活所以叫做“利器”。接下來(lái)的語(yǔ)法特性都是為達(dá)到這兩點(diǎn)來(lái)服務(wù)的。匹配的過(guò)程就是一個(gè)個(gè)的字符在匹配,比如說(shuō)"0310handan",寫成正則表達(dá)式就是10個(gè)單元項(xiàng),依次對(duì)應(yīng)著0,3,1,0,h,a,n,d,a,n,加入什么樣的語(yǔ)法特性可以讓正則式里的一個(gè)單元項(xiàng)來(lái)匹配很多的字符呢,很自然的想法就是用一個(gè)單元項(xiàng)來(lái)表示很多存在某個(gè)共性的字符的集合,這個(gè)單元項(xiàng)叫做字符類,比如說(shuō)[xyz]可以匹配x,y或者z,[^xyz]匹配x,y,z之外的任何字符,[a-z]匹配所有小寫字母,d可以匹配數(shù)字0-9,等等。Java正則表達(dá)式API提供了豐富的預(yù)定義字符類來(lái)表述這種想法,常用的有以下幾種,d,D,w,W,s,S。這幾個(gè)挺好記憶的,因?yàn)樘S昧怂杂浄ê?jiǎn)單,Java還提供了具有如下通用形式的大量的字符類,p{name},name指定類的名稱,以下是幾個(gè)示例:
p{Lower} 包含小寫字母
p{Upper} 包含大寫字母
p{Punct} 包含所有的標(biāo)點(diǎn)符號(hào)
不管記法怎樣,這些統(tǒng)統(tǒng)都表示一個(gè)單元項(xiàng),用來(lái)匹配一個(gè)字符,還遺漏一個(gè)“大人物”,就是通配符,寫出來(lái)就是一個(gè)點(diǎn)號(hào)".",為啥說(shuō)它是大人物呢,它能匹配所有字符。
到了這里雖然長(zhǎng)見識(shí)了,但是也有疑問(wèn)了,表述能力是強(qiáng)了,不過(guò)寫起來(lái)還是很麻煩呀,以"0310handan"為例,還是要寫出來(lái)10個(gè)單元項(xiàng),只是每個(gè)單元項(xiàng)有了多種可選擇的寫法而已,比如可以寫成...d.....p{Lower},但是寫出來(lái)的豈不是更長(zhǎng)了,不由得感嘆這正則表達(dá)式白學(xué)了,好麻煩。該介紹正則表達(dá)式中一個(gè)化繁為簡(jiǎn)的語(yǔ)法特性了,就是量詞,具體地說(shuō)分為貪婪量詞,脅迫量詞,占有量詞。量詞用處很大并且使用簡(jiǎn)單,它決定了一個(gè)單元項(xiàng)將匹配多少次,簡(jiǎn)單的說(shuō)可以把多個(gè)相同的單元項(xiàng)合并,所以上面的寫法也就是從語(yǔ)法上說(shuō)能匹配"0310handan",實(shí)際中不可能這么干,因?yàn)橐M量把每個(gè)字符都表示成統(tǒng)一的形式,這樣再用個(gè)量詞就可以寫的簡(jiǎn)潔些,比如說(shuō)用這個(gè)式子來(lái)匹配該字符串:ddddwwwwww,應(yīng)用量詞后就可以寫成: d+w{6} 量詞如下所示:
+ 匹配1次或多次
* 匹配0次或多次
? 匹配0次或1次
這3個(gè)很常用,不過(guò)只要這仨的話夠用不?很明顯,這都沒(méi)有指定具體的量是多少,用{num}可以指定次數(shù),比如說(shuō)x{2}匹配"xx"。現(xiàn)在夠了么,固定次數(shù)顯得不夠靈活,還要有指定最小次數(shù)和最大次數(shù)的{min,max},這里不指定max也可以,例如x{2,}可以匹配"xx","xxx","xxxx",等等。量詞的種類現(xiàn)在似乎夠用了。其實(shí)還沒(méi)介紹完,到此為止談?wù)摰亩际秦澙妨吭~,那么脅迫量詞和占有量詞是咋回事兒呢?后面再做解釋。
總結(jié)
- 上一篇: 动易CMS之标签管理
- 下一篇: 自己对DHCP的理解