標(biāo)簽(空格分隔): java
方法一:split() 方法——JDK 1.4 or later##
例子:
public class StringSplit {
public static void main(String[] args) {
//一般用法
String sourceStr = "1,2,3,4,5";
String[] sourceStrArray = sourceStr.split(",");
for (int i = 0; i < sourceStrArray.length; i++) {
System.out.println(sourceStrArray[i]);
}
// 限定最多分割出3個(gè)字符串
int maxSplit = 3;
sourceStrArray = sourceStr.split(",", maxSplit);
for (int i = 0; i < sourceStrArray.length; i++) {
System.out.println(sourceStrArray[i]);
}
}
}
//輸出結(jié)果:
1
2
3
4
5
1
2
3,4,5
分隔符如果用到一些特殊字符更卒,可能會(huì)得不到我們預(yù)期的結(jié)果。在正則表達(dá)式中有特殊的含義的字符丙躏,我們使用的時(shí)候必須進(jìn)行轉(zhuǎn)義
public class StringSplit {
public static void main(String[] args) {
String value = "192.168.128.33";
// 注意要加\\,要不出不來(lái),yeah
String[] names = value.split("\\.");
//String[] output = test.split(Pattern.quote("."));
//使用 \\ 跟使用Pattern.quote的效果一樣
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
//轉(zhuǎn)義字符總結(jié)
1.字符 "|" "*" "+" "." "," 在正則表達(dá)式中用\\.表示墨叛,或者用Pattern.quote方法表示。
2.而如果是"\"骏全,那么就得寫成"\\\\"与斤。
3.如果一個(gè)字符串中有多個(gè)分隔符肪康,可以用"|"作為連字符。
字符串中有多個(gè)分隔符撩穿,可以用"|"作為連字符的例子:
public static void main(String[] args)
{
String str ="Java string-split#test";
String[] sourceStrArray = str.split(" |-|#");
//注意上面的(" |-|#")的一開(kāi)始的字符就是空格磷支,看上去好像沒(méi)寫一樣喔
for (int i = 0; i < sourceStrArray.length; i++) {
System.out.println(sourceStrArray[i]);
}
}
有時(shí)在分割字符串之前需要對(duì)字符串進(jìn)行一些檢查,如:
public static void main(String[] args)
{
String test = "abc.def.123";
//開(kāi)始檢查
if(test.contains(".")){
String[] output = test.split("\\.");
//第二次檢查
if(output.length!=3){
throw new IllegalArgumentException(test + " - invalid format!");
}else{
System.out.println(output[0]);
System.out.println(output[1]);
System.out.println(output[2]);
}
}else{
throw new IllegalArgumentException(test + " - invalid format!");
}
}
高級(jí)用法:結(jié)合正則表達(dá)式
但是使用正則的話食寡,效率肯定是有問(wèn)題的
public class Test01 {
public static void main(String[] args) {
String str = "one123";
String regex = "(?<=one)(?=123)";
// String regex = "(?<=one)"; 效果和上面的那句一樣
String[] strs = str.split(regex);
for(int i = 0; i < strs.length; i++) {
System.out.printf("strs[%d] = %s%n", i, strs[i]);
}
}
}
結(jié)果輸出:
strs[0] = one
strs[1] = 123
為什么呢雾狈?表示對(duì)正則表達(dá)式不是太懂?抵皱?善榛?辩蛋?
方法二:StringTokenizer ——從JDK1.0開(kāi)始便可以使用StringTokenizer,JDK1.4開(kāi)始才有String.split()移盆。
注意:StringTokenizer是老版本對(duì)方法悼院,因?yàn)榧嫒菪缘脑虿还膭?lì)使用,推薦使用String.split()咒循。但是StringTokenizer效率高据途,在后文的三種方法的比較中會(huì)說(shuō)到
簡(jiǎn)單用法例子:
public static void main(String[] args) {
String test = "abc.def.123";
StringTokenizer token = new StringTokenizer(test, ".");
while (token.hasMoreTokens()) {
//利用循環(huán)來(lái)獲取字符串str1中下一個(gè)語(yǔ)言符號(hào)
System.out.println(token.nextToken());
}
}
輸出結(jié)果:
abc
def
123
格外注意:對(duì)于兩個(gè)分隔符之間的空字符串會(huì)忽略。例如:
public static void main(String[] args) {
String ip = "192.168.123..33";//兩個(gè)點(diǎn)之間是空字符串
// String ip = "192.168.123. .33";//兩個(gè)點(diǎn)之間是空格
StringTokenizer token=new StringTokenizer(ip,".");
while(token.hasMoreElements()){
//注意這里用的是hasMoreElements()跟hasMoreTokens()效果一樣
System.out.print(token.nextToken()+" ");
}
}
輸出結(jié)果:192 168 123 33 //注意"192.168.128...33"中間的...這三個(gè)點(diǎn)中間是有兩個(gè)空字符串叙甸,是空字符串颖医,而不是空格喔!裆蒸!因?yàn)槭强兆址巯簦郧谐鰜?lái)的也是空,什么都沒(méi)有
例子二:
int num1 = strT1.countTokens();//獲取字符串str1后的個(gè)數(shù)
hasMoreElements()跟hasMoreTokens()效果一樣
String nextToken()
返回此 string tokenizer 的下一個(gè)標(biāo)記僚祷。
String nextToken(String delim)
返回此 string tokenizer 的字符串中的下一個(gè)標(biāo)記佛致。
public static void main(String[] args)
{
String str1 = "Hello world!This is Java code,stringTokenizer Demo.";
//聲明并初始化字符串str1
String str2 = "How to use StringTokenizer?StringTokenizer?";
//聲明并初始化字符串str2
StringTokenizer strT1 = new StringTokenizer(str1," ,.!");
//創(chuàng)建StringTokenizer類的對(duì)象strT1,并構(gòu)造字符串str1的分析器
//以空格符、","久妆、"."及"!"作為定界符
StringTokenizer strT2 = new StringTokenizer(str2," ?");
//創(chuàng)建StringTokenizer類的對(duì)象strT2,并構(gòu)造字符串str2的分析器
//以空格符及"?"作為定界符
int num1 = strT1.countTokens();
//獲取字符串str1中語(yǔ)言符號(hào)的個(gè)數(shù)
int num2 = strT2.countTokens();
//獲取字符串str2中語(yǔ)言符號(hào)的個(gè)數(shù)
System.out.println("str1 has "+num1+" words.They are:");
while(strT1.hasMoreTokens())
{ //利用循環(huán)來(lái)獲取字符串str1中下一個(gè)語(yǔ)言符號(hào),并輸出
String str = strT1.nextToken();
System.out.print("\""+str+"\" ");
}
System.out.println("\nstr2 has "+num2+" words.They are:");
while(strT2.hasMoreElements())
{ //利用循環(huán)來(lái)獲取字符串str2中下一個(gè)語(yǔ)言符號(hào),并輸出
String str = strT2.nextToken();
System.out.print("\""+str+"\" ");
}
}
注意還有一個(gè)一個(gè)參數(shù)的StringTokenizer(String str)構(gòu)造方法
使用默認(rèn)的定界符晌杰,即空格符(如果有多個(gè)連續(xù)的空格符跷睦,則看作是一個(gè))筷弦、換行符、回車符抑诸、Tab符號(hào)等
例子;
String str1 ="A B \nC";//情況一C烂琴,將空格符、換行符作為定界符蜕乡,多個(gè)連續(xù)的空格符奸绷,則看作是一個(gè)
//String str1 ="A B \\nC";情況二,在情況一的基礎(chǔ)上將換行符用“\”轉(zhuǎn)義了
StringTokenizer strT1 = new StringTokenizer(str1);
while(strT1.hasMoreTokens())
{ //利用循環(huán)來(lái)獲取字符串str1中下一個(gè)語(yǔ)言符號(hào),并輸出
String str = strT1.nextToken();
System.out.print("'"+str+"'");
}
輸出結(jié)果:情況一:'A''B''C'
情況二:'A''B''\nC'
方法三:使用String的兩個(gè)方法—indexOf()和subString()——subString()是采用了時(shí)間換取空間技術(shù)层玲,因此它的執(zhí)行效率相對(duì)會(huì)很快号醉,只要處理好內(nèi)存溢出問(wèn)題,但可大膽使用辛块。而indexOf()函數(shù)是一個(gè)執(zhí)行速度非撑吓桑快的方法##
1、substring(int begin);截取掉s從首字母起長(zhǎng)度為begin的字符串润绵,將剩余字符串賦值給s线椰;
String text ="我愛(ài)你";
String temp= text.substring(1);
System.out.println(temp);
輸出:愛(ài)你
2、substring(int begin尘盼,int end);截取s中從begin開(kāi)始至end結(jié)束時(shí)的字符串憨愉,并將其賦值給s;注意:不包括end
String text ="我愛(ài)你們";
String temp= text.substring(0,2);
System.out.println(temp);
輸出:我愛(ài)
3烦绳、indexOf(subString[, startIndex])返回 String 對(duì)象內(nèi)第一次出現(xiàn)子字符串的字符位置。 如果沒(méi)有找到子字符串配紫,則返回 -1径密。
subString 必選項(xiàng)。要在 String 對(duì)象中查找的子字符串躺孝。
starIndex 可選項(xiàng)睹晒。該整數(shù)值指出在 String 對(duì)象內(nèi)開(kāi)始查找的索引。如果省略括细,則從字符串的開(kāi)始處查找伪很。
額外注意的:charAt():charAt()方法可用來(lái)獲取指定位置的字符串,index為字符串索引值奋单,從0開(kāi)始到string.leng - 1锉试,若不在這個(gè)范圍將返回一個(gè)空字符串
var str = 'abcde';
console.log(str.charAt(2)); //返回c
console.log(str.charAt(8)); //返回空字符串
lastIndexOf()語(yǔ)法與indexOf()類似,它返回的是一個(gè)指定的子字符串值最后出現(xiàn)的位置览濒,其檢索順序是從后向前呆盖。
將indexOf()和subString()結(jié)合來(lái)截取的例子
//這個(gè)做法十分巧妙
public static void out(){
String str = "我愛(ài)你們,你愛(ài)他,他愛(ài)她們加一,她愛(ài)他";
//因?yàn)椴恢赖降捉厝⊥曛笥卸嗌賯€(gè),所以用集合保存
List stringList =new ArrayList<String>();
String temp = str;
while (true) {
String splitStr = null;
int index = temp.indexOf(",");
if (index < 0) {
break;
}
splitStr = temp.substring(0, index);
System.out.println(splitStr);
stringList.add(splitStr);
temp = temp.substring(index + 1);
}
}
如果十分有規(guī)律的話贷笛,也可以像下面這樣做
![此處輸入圖片的描述](http://o6uwc0k25.bkt.clouddn.com/%E6%9C%89%E8%A7%84%E5%BE%8B.png)
上面的做法雖然是可以但是有點(diǎn)笨应又,其實(shí)可以有聰明點(diǎn)的做法:
適合情況:當(dāng)分隔符是一個(gè)字符時(shí)
private static List<String> split2( final String str )
{
final List<String> res = new ArrayList<String>( 10 );
int pos, prev = 0;
while ( ( pos = str.indexOf("" + m_separatorChar, prev ) ) != -1 )
{
res.add( str.substring( prev, pos ) );
prev = pos + 1; // start from next char after separator
}
res.add( str.substring( prev ) );
return res;
}
適合情況:當(dāng)分隔符是多個(gè)字符時(shí)
private static List<String> split( final String str )
{
final List<String> res = new ArrayList<String>( 10 );
int pos, prev = 0;
while ( ( pos = str.indexOf( m_separator, prev ) ) != -1 )
{
res.add( str.substring( prev, pos ) );
prev = pos + m_separator.length(); // start from next char after separator
}
res.add( str.substring( prev ) );
return res;
}
三種方法的比較:##
1、String.split(String.split是用正則表達(dá)式匹配乏苦,所以不使用KMP字符串匹配算法)用的都是按順序遍歷的算法株扛,時(shí)間復(fù)雜度O(m*n),較高汇荐,所以性能上洞就,StringTokenizer好很多,對(duì)于頻繁使用字符串分割的應(yīng)用掀淘,例如etl數(shù)據(jù)處理旬蟋,使用StringTokenizer性能可以提高很多。
2革娄、在split需要被大量調(diào)用的場(chǎng)合倾贰,在現(xiàn)有的Android VM里面,String類的split方法肯定是不符合要求的拦惋,StringTokenizer是最廉價(jià)的替換split的方法匆浙,簡(jiǎn)單修改成這個(gè)實(shí)現(xiàn)之后,花費(fèi)時(shí)間能提升一個(gè)數(shù)量級(jí)