java字符串切割

標(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ī)律的話贷笛,也可以像下面這樣做


此處輸入圖片的描述
此處輸入圖片的描述

上面的做法雖然是可以但是有點(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í)

3架忌、indexOf結(jié)合subString經(jīng)過(guò)充分的優(yōu)化吞彤,對(duì)于結(jié)構(gòu)化特別是表格類的數(shù)據(jù),效率是最快的

Java 字符串操作常用的各種的方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饰恕,隨后出現(xiàn)的幾起案子挠羔,更是在濱河造成了極大的恐慌,老刑警劉巖埋嵌,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破加,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雹嗦,警方通過(guò)查閱死者的電腦和手機(jī)范舀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)了罪,“玉大人锭环,你說(shuō)我怎么就攤上這事〔磁海” “怎么了辅辩?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娃圆。 經(jīng)常有香客問(wèn)我玫锋,道長(zhǎng),這世上最難降的妖魔是什么讼呢? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任撩鹿,我火速辦了婚禮,結(jié)果婚禮上悦屏,老公的妹妹穿的比我還像新娘节沦。我一直安慰自己,他們只是感情好窜管,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布散劫。 她就那樣靜靜地躺著稚机,像睡著了一般幕帆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赖条,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天失乾,我揣著相機(jī)與錄音,去河邊找鬼纬乍。 笑死碱茁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仿贬。 我是一名探鬼主播纽竣,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蜓氨?” 一聲冷哼從身側(cè)響起聋袋,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穴吹,沒(méi)想到半個(gè)月后幽勒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡港令,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年啥容,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷霹。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咪惠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淋淀,到底是詐尸還是另有隱情硝逢,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布绅喉,位于F島的核電站渠鸽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柴罐。R本人自食惡果不足惜徽缚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望革屠。 院中可真熱鬧凿试,春花似錦、人聲如沸似芝。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)党瓮。三九已至详炬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞奸,已是汗流浹背呛谜。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枪萄,地道東北人隐岛。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓷翻,于是被迫代替她去往敵國(guó)和親聚凹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子割坠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • Javascript有很多字符串的方法,有的人有W3C的API妒牙,還可以去MDN上去找韭脊,但是我覺(jué)得API上說(shuō)的不全,...
    頑皮的雪狐七七閱讀 2,158評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法单旁,類相關(guān)的語(yǔ)法沪羔,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法象浑,異常的語(yǔ)法蔫饰,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 1 當(dāng)你看到標(biāo)題,有沒(méi)有立刻想到田震的那首歌曲:“我家住在黃土高坡愉豺,大風(fēng)從坡上刮過(guò)篓吁,不管是西北風(fēng),還是東南風(fēng)蚪拦,都是...
    小苜蓿閱讀 719評(píng)論 18 15
  • 1 環(huán)境搭建 查看php環(huán)境信息 2 下載地址 Laravel 中文網(wǎng) Laravel 利用 Composer(C...
    捔落纏綿閱讀 1,877評(píng)論 0 0