2013-04-30 67 views
-1

到目前爲止,我已經得到了這個正則表達式,通過拆分和移除空格將我的字符串拆分爲字符串數組,並且還通過運算符分割,但保留運算符並插入到相同的數組中。正則表達式用於java分割空格,數字和運算符,但保留運算符和數字

tokens = rpn.split("(?<=\\s) |(?=\\s) |(?>\\s+) |(?<=[-+*/()])|(?=[-+*/()])|(?>=[-+*/()])");

E.g. input 2 3 + OR 2 3+; 
    output a[0]=2;a[1]=3;a[2]=+ 

這是一個RPN計算器,刪除所有空格和獨立的數字和運算。

上述正則表達式的作品分裂數字和運算e.g. 3+ into 3 + but if I have 2 3 + 然後輸出tokens[0]=2; tokens[1]=3;tokens[2]="";tokens[3]=+;

請人幫忙解決這個問題的正則表達式。

+0

對不起,您可以嘗試澄清它是你想要的嗎?發佈幾個'input' - >'output'的例子 – HennyH 2013-04-30 11:41:50

回答

0

這爲我工作:

tokens = rpn.replaceAll("(?=\\p{Punct})|(?<=\\p{Punct})", " ").split("\\s+"); 

這增加了標點符號的空間,然後分割上的空白。您可以用更具體的標點符號代替\\p{Punct},如果您喜歡,可以使用[-+*/()]

0

拆分....我用下面的正則表達式試了一下:對下一個字符不是數字(十進制)的任何一點

\s*(?=[^0-9.]+)\s* 

拆分。你可能必須要聰明號碼是否可以爲負(這需要一個ahange您的數據格式反正)

編輯:我在Perl中測試了它......

0

如果我理解正確的話,你可以像這樣執行分割。

public String[] split(String text) { 
    ArrayList<String> a = new ArrayList<String>(); 
    Matcher matcher = Pattern.compile("(\\d+|[\\+\\-*/])").matcher(text); 
    int idx = 0; 
    while (matcher.find(idx)) { 
     a.add(matcher.group()); 
     idx = matcher.end(); 
    } 
    return a.toArray(); 
} 

public void testSplit() { 
    Assert.assertArrayEquals(new String[] {"3", "+", "5", "*", "3", "-", "4"}, 
      split("3 + 5 * 3-4")); 
} 

它比單純的正則表達式更清晰,更容易理解。

相關問題