2017-02-23 72 views
0

欲沿若干不同的條件拆分串 - 我知道有是一個Java字符串方法稱爲String.split(元件),其將字符串成基於所指定的元件上的陣列。與幾個條件的Java分割字符串

然而,多個對象之間的分裂似乎是非常複雜的 - 尤其是如果分割必須發生的一系列元素。

準確地說,我希望Java字符串

  • 「一> = b」 的分成{ 「一」, 「> =」, 「B」}

  • 「一> b」變成{ 「​​一」, 「>」, 「b」}

  • 「一個== b」 變成{ 「​​一」, 「==」, 「b」}

我一直在用正則表達式來擺弄,看看如何根據這個參數精確地分割它,但是最近的我只是沿着單個字符分裂。

編輯:a和b是任意長度的任意字符串。我只是想沿着不同類型的比較器「>」,「> =」,「==」分開;

例如,可以是「蘋果」和B可能是「橙色」。

所以在最後我想從「蘋果> =橙」字符串轉換 {「蘋果」,「> =」,「橙色」}

+1

拆分的條件是什麼? – AntonH

+0

我指定的條件正是我想要的。 –

+0

爲什麼不重寫你的字符串爲> = b,a Sedrick

回答

1

您可以使用正則表達式。不管你是否使用,或b或ABC爲您的變量,你會得到第一個變量第1組,第2組中的條件和該組中的第二個變量3

Pattern pattern = Pattern.compile("(\\w+)([<=>]+)(\\w+)"); 
    Matcher matcher = pattern.matcher("var1>=ar2b"); 

    if(matcher.find()){ 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
     System.out.println(matcher.group(3)); 
    } 
+0

完美。然而,正則表達式如何知道> =和>之間的差異?我一直在努力學習它幾天,但仍不明白它如何識別「>」與「>」不同,「>」 –

+0

你的正則表達式將捕獲的東西遠遠多於我的意圖 – niceman

+1

我更喜歡這個正則表達式:'「(\\ w +)「+(compop)+」(\\ w +)「'其中'compop =」> | <|==|<=|> =「' – niceman

0

下面的代碼適用於你的例子:

System.out.println(Arrays.asList("a<=b".split("\\b"))); 

它分割字邊界上的字符串。

如果你需要更精細的分割,你必須提供更多的例子。

0

你可以要分割上像這樣

public String[] splitString(String word) 
{ 
    String[] pieces; 
    String[] tokens = {"==", ">=", "<=","<", ">"}; 
    for(int i = 0; i < tokens.length; i++) 
    { 
     if(a.contains(tokens[i])) 
     { 
      pieces = { 
        word.substring(0, word.indexOf(tokens[i])), 
        tokens[i], 
        word.substring(word.indexOf(tokens[i]) + tokens[i].length(), word.length())}; 
      return pieces; 
     } 
    } 
    return pieces; 
} 

這將返回無論是令牌之前找到一個數組取令牌代碼它的手和使用,令牌本身無論是離開了。

+0

'a'?!!你不是指「字」嗎? – niceman

0

將給定字符串拆分爲子字符串的示例中,我不認爲String的拆分方法對您來說足夠好。原因在於,split方法將正則表達式作爲輸入,並在分割正則表達式的同時分割數據。對於例如

String [] data =「a = b」.split(「=」);將給出數據[0] =「a」,數據[1] =「b」和「=」將被消耗。

嘗試使用Pattern類和明智地選擇一個正則表達式,

這裏是一個小程序,滿足您的要求。您可以照原樣使用,並且按照您的期望工作。根據您的拆分邏輯

import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Solution { 

    static final Pattern SPLITTER_PAT = Pattern.compile("([a-zA-Z]|[><=]+)"); 

    public static void main(String[] args) { 
     List<String> dataList = new ArrayList<String>(); 
     dataList.add("a>=b"); 
     dataList.add("a>b"); 
     dataList.add("a==b"); 
     dataList.add("a<=b"); // just added one more case similar to yours 

     for (String data : dataList) { 
      Matcher m = SPLITTER_PAT.matcher(data); 
      System.out.print("Splitting string " + data + " into "); 
      while (m.find()) { 
       System.out.print("'" + m.group(1) + "' "); 
      } 
      System.out.println(); 
     } 
     System.out.println(); 
     System.out.println("That's it"); 
    } 
} 

立足現在,可以在輸入出現什麼人物,你可能需要修改正則表達式「([A-ZA-Z] | [> < =] +)」的模式對象。

希望有所幫助。

+0

與reos的回答相同的問題,請參閱下面的評論:) – niceman

+0

@niceman:你是對的,但我爲Kevin提供的樣本數據編寫了這個正則表達式。我的主要意圖是使用Pattern/regex而不是String.split,因爲後面的不足以解決問題。我甚至在我的答案中寫道,根據實際的數據樣本,他將不得不調整正則表達式。現在,凱文已經編輯了這個問題,並提供了更多關於數據的細節,我的正則表達式變化並變成「([a-zA-Z] + | [><=] +)」,但即使這樣也不會完美,因爲它取決於樣本數據。 –