2011-12-19 39 views
1

我想更換一個子串中出現的所有帶有值較大的字符串替換我#(看的例子輸入/輸出)與陣列的價值,但我不知道怎麼樣用Java + Regex做到這一點。陣列中的

假設有以與陣列:[3,2,1,0]

實施例輸入:
I0
I1^2
(I1 + 2)5
2 * 5 + I1
I1 + I2-I3
1 + 2

輸出示例:
3 [爲什麼呢?輸入是陣列中i0和索引0 = 3]
2^2
(2 + 2)5
2 * 5 + 2
2 + 1-0
1 + 2

正則表達式是在這裏:
http://rubular.com/r/KXbCQnbs8K

REGEX = I {1}(\ d +)

代碼:

private String replace(String input){ 
    StringBuffer s = new StringBuffer(); 
    Pattern regex = Pattern.compile(REGEX); 
    Matcher m = regex.matcher(input); 

    if(!m.find(0)){ 
     return input; 
    }else{ 
     m.reset(); 
    } 

    while (m.find()){ 
     m.appendReplacement(s, getRealValue(m.group(1))); 
    } 
    return s.toString(); 
} 

private String getRealValue(String val){ 
    int value = Integer.parseInt(val); 
    return String.valueOf(array.get(value)); 
} 

假定我給出的總是有效的。我的代碼適用於某些情況,但大多數情況下會失敗。任何幫助?謝謝!

編輯: 我不知道如何告訴它添加最後一部分(例如:+5在i0 + 5)。

I0 - 工程
I1^2 - 不工作
(I1 + 2)+5 - 不工作
2 * 5 + I1 - 工程
I1 + i2- I3 - 不工作
1 + 2 - 工程
1 + I2 - 工程

我想修改的正則表達式 「我{1}(\ d +)(。*)」
if(lastMatch()){//如果最後匹配成立,則爲真
s + = m.group(2)//將最後一組(即「+5」 0 + 5" )
}
但我不知道該正確的語法。

+0

看起來不錯......什麼情況下它不工作? – aishwarya 2011-12-19 12:38:18

+0

看到我上面的編輯,謝謝! – cnandreu 2011-12-19 12:45:49

回答

3

因此,它失敗了......產生的輸出是錯誤的是什麼?這是您忽略提及的非常有用的信息。在未來,您應該嘗試更多地思考爲什麼輸出錯誤,這將幫助您確定程序做錯了什麼。

但是在完成所有替換之後,您忘記了使用Matcher.appendTail(StringBuffer)appendTail追加最後一場比賽後的所有剩餘字符,例如。 "i0[this bit]"

我想錯了產量

  • i1^2 -> 2
  • (i1+2)+5 -> (2

望着這也將是更快弄清楚發生了什麼事情錯了。忘記在最後添加String的最後一位。讓我們找到一種方法來對此進行分類或閱讀API,以查看是否有一種方法可以在一個簡單的步驟中完成。

示例代碼

while (m.find()){ 
    m.appendReplacement(s, getRealValue(m.group(1))); 
} 
m.appendTail(s); // you missed out this line 
return s.toString(); 
+0

謝謝,現在它完美的工作!對不起,我忘了在我的問題中添加重要信息,幾秒前我編輯了我的帖子,其中包括失敗的測試用例,以及在我的帖子上評論過aishwarya後我認爲是錯誤的。我將在未來的提交中留下您的意見。再次感謝! – cnandreu 2011-12-19 12:58:15

+1

不用擔心。我主要是想讓你考慮你程序中的未來錯誤。查找錯誤中的模式可以幫助您找出問題出現的速度。 – Dunes 2011-12-19 13:03:31