C# 使用正则表达式将字符串中的文本替换为delimeters

C# 使用正则表达式将字符串中的文本替换为delimeters,c#,regex,replace,C#,Regex,Replace,我有一根线,像 string str = "(50%silicon +20%!(20%Gold + 80%Silver)| + 30%Alumnium)"; 我需要一个正则表达式来替换中间的内容!和|使用空字符串。结果应该是(50%硅+20%+30%铝) 如果字符串包含以下内容(带嵌套分隔符): 结果应该是(50%硅+20%+30%铝)-忽略嵌套分隔符 我尝试了以下正则表达式,但它没有忽略嵌套: Regex.Replace(str , @"!.+?\|", "", RegexOptions.I

我有一根线,像

string str = "(50%silicon +20%!(20%Gold + 80%Silver)| + 30%Alumnium)";
我需要一个正则表达式来替换中间的内容!和|使用空字符串。结果应该是
(50%硅+20%+30%铝)

如果字符串包含以下内容(带嵌套分隔符):

结果应该是
(50%硅+20%+30%铝)
-忽略嵌套分隔符

我尝试了以下正则表达式,但它没有忽略嵌套:

Regex.Replace(str , @"!.+?\|", "", RegexOptions.IgnoreCase);
适用于提供的两个字符串。我扩展了正则表达式,第二次选中“/”以替换剩余字符


适用于提供的两个字符串。我扩展了正则表达式,第二次选中“/”以替换剩余字符

您正在使用惰性量词
+?
,它将查找与正则表达式匹配的最小可能子字符串。要获得所需的结果,您需要使用贪婪量词
+
,它将匹配可能的最大子字符串

下面的正则表达式(未在C#中测试,因为我没有可用的正则表达式,但这应该适用于任何标准正则表达式实现)将满足您的要求:


“!.+\\\”

您正在使用惰性量词
+?
,它将查找与正则表达式匹配的最小可能子字符串。要获得所需的结果,您需要使用贪婪量词
+
,它将匹配可能的最大子字符串

下面的正则表达式(未在C#中测试,因为我没有可用的正则表达式,但这应该适用于任何标准正则表达式实现)将满足您的要求:


“!.+\\\”

你应该认真地解释你的问题,并将其格式化。当然,我会处理你提到的事情。Alex我尝试了下面给出的方法Regex.Replace(str,@“!.+?\ \ \ \ \”,“”,RegexOptions.IgnoreCase);当嵌套的delimeters出现时,问题就出现了。嵌套的delimeters应该被忽略。你应该认真地解释你的问题,并将其格式化。当然,我会处理你提到的事情。Alex我尝试了下面给出的方法Regex.Replace(str,@“!.+?\ \ \ \ \”,“”,RegexOptions.IgnoreCase);当嵌套的delimeters出现时,问题就出现了。嵌套的delimeters应该被忽略。它正在工作。对于第一部分,但在第二部分失败。当然,我会致力于你提到的事情。Alex我尝试了下面给出的方法Regex.Replace(str,@“!.+?\ \ \ \ \”,“”,RegexOptions.IgnoreCase);但是当有嵌套的delimeter时,问题就来了。嵌套的delimeter应该被忽略。它正在工作。对于第一部分,但在第二部分失败。当然,我会致力于你提到的事情。Alex我尝试了下面给出的方法Regex.Replace(str,@“!.+?\ \ \ \ \”,“”,RegexOptions.IgnoreCase);但是当有嵌套的delimeter时,问题就来了。嵌套的delimeter应该被忽略。
Regex.Replace(str , @"!.+?\|", "", RegexOptions.IgnoreCase);
using System.Text.RegularExpressions;

str = Regex.Replace(str , @"!.+?\|", "", RegexOptions.IgnoreCase);
 Regex.Replace(str, @"!.+?\||\)\|", "", RegexOptions.IgnoreCase);