-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( "Test-KB")」です。

正規表現でこれを行う方法はありますか?

どんなアドバイス/助けも大歓迎です。

4

5 に答える 5

2

あなたの例では、あなたが望むもののように見える、に置き換えることができます-(-1*(、それは実際にはあなたの正確な文字列に依存します。たとえば、あなたの例ではTest - KB、-は文字列の一部ではないため、-が置き換えられることはありません。代わりに、文字列に追加される計算です。

于 2012-08-09T02:54:40.697 に答える
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);
于 2012-08-09T03:48:20.180 に答える
0

この正規表現を試して、「(」によって配置された「-」のみに一致させることができます。

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

于 2012-08-09T02:59:05.143 に答える
0

このコードを試してください:

using System.Text.RegularExpressions;

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

このコードは-(を見つけ、-1 *(に置き換えます

于 2012-08-09T02:59:20.053 に答える
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)

他の部分と「似ている」場合でも、弦には触れないように注意してください。

于 2012-08-09T03:17:25.937 に答える