2012-08-09 39 views
-1

我有如下字符串,更換 「 - 」 與 「-1 *」 使用正則表達式

string str = "FX(Y + 1, -(5 * 10) + FML("Test - KB")"; 

我想換成了 「 - 」 與 「-1 *」。但它不應該適用於文字字符串。例如。 FML(「Test-KB」)不應該更改爲FML(「Test -1 * KB」)。

所需的輸出是 「FX(Y + 1,-1 *(5 * 10)+ FML(」 測試 - KB 「)」

有一種方法在正則表達式來做到這一點

任何意見/幫助深表感謝。

+0

該字符串無效。 – 2012-08-09 03:38:34

回答

0

它會是這個樣子:

var result = Regex.Replace("FX(Y + 1, -(5 * 10) + FML(\"Test - KB\")", 
          "(?<=^([^\"]|\"[^\"]*\")*)-", 
          "-1 * "); 

正則表達式的解釋:

(?<=  # preceded by.. 
^   # the start of the string, then 
([^"]  # either not a " character 
|"[^"]*" # or a string: "..." 
)*   # as many times as you want 
) 
-   # then match the hyphen 

輸出爲您的示例字符串是:

FX(Y + 1, -1 * (5 * 10) + FML("Test - KB") 

(請注意,這不處理字符串轉義,如果他們在你的目標語言的支持。)

該解決方案將正確處理字符串,而不僅僅是啓發式。這裏有一個例子:

FX(Y+1, -(X+Y) + "EMBEDDED: FX(Y + 1, -(5 * 10)" - (X+Y) 

變爲:

FX(Y+1, -1 *(X+Y) + "EMBEDDED: FX(Y + 1, -(5 * 10)" -1 * (X+Y) 

注意,字符串沒有觸及,即使它「看起來像」的其他部分。

+0

你不覺得它太複雜嗎? – 2012-08-09 03:18:58

+0

@NikhilAgrawal:不是,那是我能想到的最簡單的解決方案,它可以正確解決他的問題。例如FX(Y + 1, - (X + Y)+「EMBEDDED:FX(Y + 1, - (5 * 10)」 - (X + Y)' – porges 2012-08-09 03:24:41

+0

然後,看看我的回答。 – 2012-08-09 03:26:52

2

在您的例子,你可以用-1*(取代-(,這似乎是你想要的,但它實際上取決於精確的字符串。例如,在你的榜樣, Test - KB永遠不會有 - 替換,因爲它不是字符串的一部分,它是一個計算得到一個傾向於字符串。

0

你可以試試這個正則表達式只匹配 「 - 」 是由放置 「(」

[^ - ] +( - )(?:()[^ - ]

+0

waaaaaaay太複雜了:) – 2012-08-09 03:02:29

0

試試這個代碼:

using System.Text.RegularExpressions; 

string str = "FX(Y + 1, -(5 * 10) + FML(\"Test - KB\")"; 
string r = new Regex("-[(]").Replace(str,"-1*("); 

這個代碼發現 - (與-1替換*(

+0

嘿Nikhil Agrawal你的代碼我的代碼。 – 2012-08-09 03:27:44

1
-(?=[^"]*(?:[^"]*\"[^"]*\"[^"]*)*$) 

前面的正則表達式字符串後面沒有被偶數或零」每一個減號匹配因此,將在此字符串匹配減號:

abc - dssda dsda asd 
ab - dssd ds F(" sdds ") 
fhdhhf - asd F("ssd") sdsd D("dsfdf") 

這確保了正在被替換的負號不包含在字符串文字中,下面是C#中的一個示例:

string input = "FX(Y + 1, -(5 * 10) + FML(\"Test - KB\")"; 
string replacement = "-1 *"; 
Regex rgx = new Regex("-(?=[^\"]*(?:[^\"]*\"[^\"]*\"[^\"]*)*$)"); 
string result = rgx.Replace(input, replacement);