2012-08-13 262 views
2

我有一個字符串替換字符串的子字符串用另一個字符串

String str = (a AND b) OR (c AND d) 

我tokenise與代碼的幫助下

String delims = "AND|OR|NOT|[!&|()]+"; // Regular expression syntax 
String newstr = str.replaceAll(delims, " "); 
String[] tokens = newstr.trim().split("[ ]+"); 

,並得到的String []下面

[a, b, c, d] 

對陣列的每個元素添加「= 1」,以便它變成

[a=1, b=1, c=1, d=1] 

現在我需要更換這些值的初始字符串使其

(a=1 AND b=1) OR (c=1 AND d=1) 

有人可以幫助或指導我?最初的String str是任意的!

回答

2

此答案是根據@Michael's idea(BIG +1爲他)的搜索詞只包含小寫字母,並加入=1他們:)

String addstr = "=1"; 
String str = "(a AND b) OR (c AND d) "; 

StringBuffer sb = new StringBuffer(); 

Pattern pattern = Pattern.compile("[a-z]+"); 
Matcher m = pattern.matcher(str); 
while (m.find()) { 
    m.appendReplacement(sb, m.group() + addstr); 
} 
m.appendTail(sb); 
System.out.println(sb); 

輸出

(A = 1和B = 1)或(c = 1和d = 1)

+0

請不要在使用StringBuilder時使用StringBuffer。 – 2012-08-13 08:04:16

+0

@PeterLawrey在這裏可以使用StringBuilder嗎? – Pshemo 2012-08-13 10:16:49

1

str允許多長時間?如果答案是「相對較短」,則可以簡單地爲數組中的每個元素執行「全部替換」。這顯然不是性能最友好的解決方案,所以如果性能是一個問題,不同的解決方案將是需要的。

+0

我已經建立了陣!我只需要將替換的數組元素放回到初始字符串中。就像我想把[a = 1,b = 1,c = 1,d = 1]放入字符串(a AND B)或者(c AND d)來代替a,b,c,d。你明白我的意思嗎? – Achilles 2012-08-13 00:32:43

+0

是的,我在說數組中的每個元素都是str.replaceAll(tokens [i],tokens [i] +「= 1」)。 – 2012-08-13 00:34:23

+0

@Pshemo提出了一個非常好的觀點「但是如果str =」(A AND B)「?你會得到str =」(A = 1 A = 1ND B = 1)「 – Achilles 2012-08-13 00:50:05

2

考慮:

String str = (a AND b) OR (c AND d); 
String[] tokened = [a, b, c, d] 
String[] edited = [a=1, b=1, c=1, d=1] 

簡單:

for (int i=0; i<tokened.length; i++) 
    str.replaceAll(tokened[i], edited[i]); 

編輯:

String addstr = "=1"; 
String str = "(a AND b) OR (c AND d) "; 
String delims = "AND|OR|NOT|[!&|() ]+"; // Regular expression syntax 
String[] tokens = str.trim().split(delims); 
String[] delimiters = str.trim().split("[a-z]+"); //remove all lower case (these are the characters you wish to edit) 

String newstr = ""; 
for (int i = 0; i < delimiters.length-1; i++) 
    newstr += delimiters[i] + tokens[i] + addstr; 
newstr += delimiters[delimiters.length-1]; 

OK,現在的解釋:

tokens = [a, b, c, d] 
delimiters = [ "(" , " AND " , ") OR (" , " AND " , ") " ] 

當通過分隔符迭代時,我們採取「(」+「a」+「= 1」。

從那裏,我們有「(A = 1」 + = 「和」 + 「B」 + 「= 1」

而上:「(A = 1和B = 1」 + =「)或(」+「c」+「= 1」。

再次:「(A = 1和B = 1)或(c = 1」 + = 「和」 + 「d」 + 「= 1」

最後(在for循環之外): 「(A = 1和b = 1)或(c = 1和d = 1」 + = 「)」

在那裏,我們有:「(A = 1和b = 1)或(C = 1 AND d = 1)「

+1

您也可以跟蹤找到所有標記的索引,並插入所需的字符串: – Michael 2012-08-13 00:37:02

+2

但是,如果'str =」(A AND B) ?你會得到'str =「(A = 1 A = 1ND B = 1)」' – Pshemo 2012-08-13 00:41:36

+0

我接受了這個評論後,我怎麼能跟蹤他們的索引tho?對不起 – Achilles 2012-08-13 00:42:34

相關問題