2017-02-23 23 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] + | [><=] +)”,但即使这样也不会完美,因为它取决于样本数据。 –