2014-09-21 125 views
2

我有我從中提取從特定四處旅行運營商的線性表達式不需要提取所有operators.ie我的表達是如何使用正則表達式

c*(a+b)+(a-b)/log(a+b)-(b-c/d)+(d-tan90) 
提取從線性表達式的特定部分操作員

括號內的操作符不需要分開。只有在兩個元素之間的操作員纔會被分開.i.e我的期望輸出將是

*,+,/, - ,+ 任何人都可以幫忙嗎?

+4

建議:不要使用正則表達式來「解析」表達式。要麼找到現有的表達式解析器,要麼自己寫一個。 – 2014-09-21 03:21:46

+0

你能建議嗎? – Subho 2014-09-21 03:27:05

+0

儘管這不像嘗試[用正則表達式解析HTML]那樣糟糕(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454# 1732454),您仍然可以使用或編寫像@StephenC所建議的解析器。迭代表達式並丟棄括號中的所有內容並存儲操作符應該相當簡單。 – azurefrog 2014-09-21 03:27:29

回答

1

如果你真的需要的是運營商,我認爲表達式分析器是矯枉過正的。

只需循環訪問字符並存儲操作員就很簡單。唯一的(小)複雜性是跟蹤括號的數量。

這個片段會給你所需的輸出,如果你結束了嵌套表達式也將工作:

String expression = "c*(a+b)+(a-b)/log(a+b)-(b-c/d)+(d-tan90)"; 
    List<Character> operators = new ArrayList<Character>(); 
    int parentheses = 0; 
    for (char c : expression.toCharArray()) { 
     // throw away everything inside () 
     if (c == '(') { 
      parentheses++; 
     } else if (c == ')') { 
      parentheses--; 
     } 
     if (parentheses > 0) { 
      continue; 
     } 

     // store operators outside () 
     if (c == '+' || c == '-' || c == '*' || c == '/') { 
      operators.add(c); 
     } 
    } 
    System.out.println(operators); // [*, +, /, -, +] 

請注意,我假設你正在開發一個有效的數學表達式在這裏。如果你不確定你會得到很好的輸入,你需要驗證它。

如果您打算做更奇特的事情,您可能需要使用表達式解析器(例如JepFormula4J)。

+0

感謝它正在爲我工​​作 – Subho 2014-09-21 03:48:48

1

假設沒有嵌套圓括號,可以通過刪除不需要的字符序列來實現。你並不需要的字符序列是:

  • 任意以()結束序列;
  • 其他任何不是操作員的字符。

您可以使用replaceAll丟棄所有這些序列。該語句將設置operators爲字符串與所有這些去除,即"*+/-+"

operators = inputString.replaceAll("\\([^)]*\\)|[^-+*/]", ""); 

這使得任何一個(組成序列,隨後的零個或多個非)字符,接着)""被替換;它也會導致任何不是-,+,*/的字符將被替換爲""。第一種方法是先測試,所以第二種方法只會影響不在括號內的字符。請注意,[^-+*/]中的連字符先出現在任何其他字符之前,這樣-不會被解釋爲指示一系列字符。

如果嵌套圓括號是可能的,那麼不要使用正則表達式。 Java中的正則表達式無法處理嵌套的構造。 (我認爲有些語言支持正則表達式來處理它們,但不支持Java,至少不是標準的Java運行時,可能會有第三方Java庫支持它)。azurefrog的答案是最好的方法。

注意:現在測試。

+0

雖然嵌套圓括號不能用經典的正則表達式來處理,但Java'Pattern'正則表達式比(從理論角度)更強大。然而,一個可以處理遞歸語法的正則表達式可能太**粗糙;即對於大多數人來說讀/寫太複雜了。你應該避免這種做法*出於這個原因*。 – 2014-09-21 03:48:12