![](/img/trans.png)
[英]How to Split a logical expression on operators as delimiters, while keeping them in the result?
[英]How to Split a mathematical expression on operators as delimiters, while keeping them in the result?
我需要拆分一個表達式
a+b-c*d/e
並分別得到a
, b
, c
, d
, e
(作為字符串數組)以及=
, -
, *
, 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個ArrayLists
的Set
。 一旦你有了,你迭代你的字符串,檢查集合是否包含給定的字符(從而確定它是否是一個運算符)。 如果是,那么,你把它放在一個列表中,如果沒有,你把它放在另一個列表中。
最后,您可以使用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.