我有如下字符串,
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”)”。
有没有办法在正则表达式中做到这一点?
非常感谢任何建议/帮助。
在您的示例中,您可以替换-(
为-1*(
, 这似乎是您想要的,但这实际上取决于您的确切字符串。例如,在您的示例中,Test - KB
- 永远不会被替换,因为它不是字符串的一部分,而是添加到字符串中的计算。
-(?=[^"]*(?:[^"]*\"[^"]*\"[^"]*)*$)
前面的正则表达式字符串将匹配每个不跟偶数或零“的减号。因此它将匹配此字符串中的减号:
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);
您可以尝试使用此正则表达式仅匹配由“(”放置的“-”
[^-]+(-)(?:()[^-]
试试这个代码:
using System.Text.RegularExpressions;
string str = "FX(Y + 1, -(5 * 10) + FML(\"Test - KB\")";
string r = new Regex("-[(]").Replace(str,"-1*(");
此代码找到 -( 并替换为 -1*(
它看起来像这样:
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)
请注意,即使字符串“看起来像”其他部分,它也不会被触及。