2013-12-17 398 views
0

我很努力讓String.split()做我想做的事情。正則表達式分裂一個詞

我有一個用空格分隔的單詞串的輸入。有些詞有特殊的功能。他們看起來像這樣:「特殊:單詞」。

我使用來測試我的正則表達式輸入的字符串看起來是這樣的:

String str = "Hello wonderful special:world what a great special:day";

我想從str.split(regex)得到的結果是上寫着「世界」和「天」的陣列;

我試着用lookahead (?<=special\:)(\w+)這樣做,但是這會將字符串拆分爲我正在尋找的單詞。我如何反轉這個表達式來獲得我期待的結果以及預測和反向預測的確切結果?

+5

我不會用'split'爲了這。使用'Pattern'和'Matcher'。 –

回答

0

嘗試PatternMatcher

String searchPattern = "Hello wonderful special:world what a great special:day"; 
    Pattern pa = Pattern.compile(":[a-zA-Z0-9]+"); 
    Matcher ma = pa.matcher(searchPattern); 
    while(ma.find()){ 
     System.out.println(ma.group().replaceFirst(":",""));  
    } 

輸出

world 
day 

通過使用split(),我們可以這樣做:

String searchPattern1 = "Hello wonderful special:world what a great special:day"; 
    for(String i:searchPattern1.split("\\s")){ 
     if(i.contains(":")){ 
      System.out.println(i.split[1]); 
     } 
    } 

這裏我們也得到與上述相同的輸出。

4

在這種情況下使用split會產生幾個問題:

  1. 過於複雜的正則表達式匹配,我們應該拆分後

    Hello wonderful special:world what a great special:day 
    ^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^ 
    
  2. 分割部分的第一個元素是空字符串""因爲拆分不會像最後一個空元素那樣修剪第一個空元素,因此您的結果將是

    ["", "world", "day"] 
    

爲了避免這種使用更直觀的方法:不是尋找一切,是不是你想要的部分,只找到你感興趣的部分要做到這一點使用PatternMatcher類。下面是例子,你如何能找到所有你的特殊的話:

String str = "Hello wonderful special:world what a great special:day"; 

Pattern p = Pattern.compile("\\b\\w+:(\\w+)\\b");//word after : will be in group 1 
Matcher m = p.matcher(str); 
while(m.find()){//this will iterate over all found substrings 
    //here we can use found substrings 
    System.out.println(m.group(1)); 
} 

輸出:

world 
day 
+0

但你不能說:在':'和':'後面的單詞之間的所有單詞? – JNK

+0

@JNK'':'和':'之後的單詞之間的所有單詞,但在開始時您沒有任何'special:word',那麼它將如何匹配'Hello wonderful special:'?此外,這樣的表達意味着「在之前有':someWord''和':'之後」的詞,但同時你不想在匹配中包含'someWord',因爲你不希望這個記號是通過拆分刪除。所以你將不得不使用環視機制,比如'(?<=:\\ w +)。*?(?= :)',但是在Java中你必須設置最大長度的look-behind,所以'\\ w +'不會編譯。模式/匹配器解決方案對於這種情況更好。 – Pshemo

0

使用行話和匹配,簡單的例子

public static ArrayList<String> parseOut(String s) 
{ 
    ArrayList<String> list = new ArrayList<String>(); 
    String regex = "([:])(\\w+)"; 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(s); 
    while (matcher.find()){ 
     list.add(matcher.group().substring(1)); 
    } 
    return list; 
}