簡體   English   中英

如何在運算符上將數學表達式拆分為分隔符,同時將它們保留在結果中?

[英]How to Split a mathematical expression on operators as delimiters, while keeping them in the result?

我需要拆分一個表達式

a+b-c*d/e 

並分別得到abcde (作為字符串數組)以及=-*d/ (也是一組運算符)。 我嘗試過:

String myString;

String myString={"a+b-c*d/e");

String[] result=new String();

String[] separator=new String[]{"+","-","/","*"};

result=myString.split(separator);

但是,它顯示錯誤。 怎么解決?

第一個問題: -

String myString;多重聲明String myString;

第二個問題: -

字符串初始化不正確。 兩端缺少雙引號。 從兩端卸下支架和支架。

String myString = "a+b-c*d/e";

第3個問題: -

String數組使用String對象而不是數組對象初始化。

String[] result=new String();  // Should be `new String[size]`

實際上,您不需要事先初始化數組。

第四個問題: -

String.split將Regular Expression作為參數,您已經傳遞了一個數組。 不管用。

采用: -

String[] result = myString.split("[-+*/]");

拆分所有運營商。


關於你的這句話: -

以及=, -, *, d, / (也是一組運算符)分開。

我不明白你想要什么。 您的示例字符串不包含= 並且d不是operator 請查看是否要編輯它。

更新: -

如果你的意思是在數組中保留運算符,你可以使用這個正則表達式: -

String myString= "a+b-c*d/e";
String[] result = myString.split("(?<=[-+*/])|(?=[-+*/])");
System.out.println(Arrays.toString(result));

/*** Just to see, what the two parts in the above regex print separately ***/
System.out.println(Arrays.toString(myString.split("(?<=[-+*/])")));
System.out.println(Arrays.toString(myString.split("(?=[-+*/])")));

輸出: -

[a, +, b, -, c, *, d, /, e]
[a+, b-, c*, d/, e]
[a, +b, -c, *d, /e]

(?<=...)表示后look-behind assertion(?=...)表示look-ahead assertion

除了split方法,您還可以使用java.util.StringTokenizer

 String myString = "a+b-c*d/e";

 List<String> operatorList = new ArrayList<String>();
 List<String> operandList = new ArrayList<String>();
 StringTokenizer st = new StringTokenizer(myString, "+-*/", true);
 while (st.hasMoreTokens()) {
    String token = st.nextToken();

    if ("+-/*".contains(token)) {
       operatorList.add(token);
    } else {
       operandList.add(token);
    }
 }

 System.out.println("Operators:" + operatorList);
 System.out.println("Operands:" + operandList);

結果:

Operators:[+, -, *, /]
Operands:[a, b, c, d, e]

只是為了獲得a / b / c / d / e:

String myString = "a+b-c*d/e";
String[] result=myString.split("[-+*/]");

以更易讀的形式:

String myString = "a+b-c*d/e";
String[] result2=myString.split("["+Pattern.quote("+-*/")+"]");

獲得+ - * /:

ArrayList<Character> list = new ArrayList<Character>();
for (char c:myString.toCharArray())
{
   if ("+-*/".contains(""+c)) list.add(c);
}
System.out.println(list);

編輯:刪除不需要的轉義字符。

開箱即用,據我所知,你不能做你想做的事。 split(String regex)不占用整個數組(與C#不同),只是表示有效正則表達式的字符串。

你可以做的是定義一個包含你的運算符和2個ArrayListsSet 一旦你有了,你迭代你的字符串,檢查集合是否包含給定的字符(從而確定它是否是一個運算符)。 如果是,那么,你把它放在一個列表中,如果沒有,你把它放在另一個列表中。

最后,您可以使用toArray(new String\\[arraySize\\])ArrayLists作為String數組返回。

我想你想要做的,更像是一個解析器,而不是一個tokenizer。

使用字符串標記生成器,通常會有一個長字符串(即“parameter1; parameter2; parameter3”),其中連接了多個元素,並使用“標記”來分隔這些元素。 使用函數“String.split”,你基本上會說:“好的,給出這個字符串中的所有元素,但要考慮到這個字符';' 分離不同的元素“。 然后你得到“parameter1”,“parameter2”,“parameter3”。 你不關心分隔符。

但是在像你這樣的數學表達式中:“a + bc * d / e”,你想獲得所有單獨的元素(操作數和運算符)。 這里沒有明確的分隔符,順序對您也很重要。 我會使用解析器庫並編寫一個小語法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM