C# 使用正则表达式捕获除特定(可能重复)模式之外的所有内容

C# 使用正则表达式捕获除特定(可能重复)模式之外的所有内容,c#,.net,regex,C#,.net,Regex,我正在尝试捕获所有字符串减去出现的*任何文本*(我不需要解析HTML或任何东西,我只需要忽略这些部分。标记必须完全匹配才能删除,因为我想保留其他标记)。在一个给定的字符串中,至少有一个标记,没有上限(尽管多个标记并不常见) 我的最终目标是匹配两个文本,一个是有变量名的文本,另一个是用它们的值替换变量名的文本(我自己不能替换变量,我没有访问该数据库的权限)。这些变量总是被我提到的span标记所包围。我知道我的标签上写着“NotTranslate”-但这是预翻译,所以所有其他文本都将完全相同 例如,

我正在尝试捕获所有字符串减去出现的
*任何文本*
(我不需要解析HTML或任何东西,我只需要忽略这些部分。标记必须完全匹配才能删除,因为我想保留其他标记)。在一个给定的字符串中,至少有一个标记,没有上限(尽管多个标记并不常见)

我的最终目标是匹配两个文本,一个是有变量名的文本,另一个是用它们的值替换变量名的文本(我自己不能替换变量,我没有访问该数据库的权限)。这些变量总是被我提到的span标记所包围。我知道我的标签上写着“NotTranslate”-但这是预翻译,所以所有其他文本都将完全相同

例如,如果这是我的两个输入文本:

亲爱的$customer,很抱歉您
您登录时遇到问题。请按照此处的说明操作
URL$article431并让我知道是否
这就解决了您的问题。

亲爱的约翰·多伊,很抱歉你 您登录时遇到问题。请按照此处的说明操作 统一资源定位地址http://url.for.help/article 和 如果这能解决您的问题,请告诉我。

我希望正则表达式返回:
亲爱的,很抱歉您登录时遇到问题。请按照此URL上的说明进行操作,并让我知道这是否解决了您的问题。

亲爱的,很抱歉您登录时遇到问题。请按照此URL上的说明进行操作,并让我知道这是否解决了您的问题。
对于这两个函数,我可以轻松地执行String.Equals()并确定它们是否相等。(我需要将带有变量的输入与替换变量的多个文本进行比较,以找到匹配项)

我很容易找到一个正则表达式,告诉我字符串中是否有任何“NotTranslate”部分:
((.+?)
,这就是我在比较之前决定是否需要去掉部分的方法。然而,我在上面的(我认为非常类似)任务中遇到了很多麻烦


我正在使用Expresso和regexstorm.net进行测试,并使用其他SO问题中的想法,使用了
(?:(.+?)(?:(?:.+?))
的许多变体,但所有这些问题都让我产生了不理解的问题。例如,这一个似乎几乎可以在Expresso中使用,但它无法获取最后一组span标记之后的结束文本;当我将span标记设置为可选时,或者尝试在末尾添加另一个(+?)时,它根本不会抓取任何内容?我尝试过使用lookaheads,但后来我还是抓取了标记+内部文本

这将捕获所有内容,然后处理掉被忽略的匹配html标记

string data = "Dear <span class=\"notranslate\">$customer</span>, I am sorry that you\r\n  are havin" +
    "g trouble logging in. Please follow the instructions at this\r\n  URL <span class=" +
    "\"notranslate\">$article431</span> and let me know if\r\n  that fixes your problem.";

string pattern = @"(?<Words>[^<]+)(?<Ignore><[^>]+>[^>]+>)?";

Regex.Matches(data, pattern)
     .OfType<Match>()
     .Select(mt => mt.Groups["Words"].Value)
     .Aggregate((sentance, words) => sentance + words );

这将捕获所有内容,然后处理出被忽略的匹配html标记

string data = "Dear <span class=\"notranslate\">$customer</span>, I am sorry that you\r\n  are havin" +
    "g trouble logging in. Please follow the instructions at this\r\n  URL <span class=" +
    "\"notranslate\">$article431</span> and let me know if\r\n  that fixes your problem.";

string pattern = @"(?<Words>[^<]+)(?<Ignore><[^>]+>[^>]+>)?";

Regex.Matches(data, pattern)
     .OfType<Match>()
     .Select(mt => mt.Groups["Words"].Value)
     .Aggregate((sentance, words) => sentance + words );

你不能做一个替换操作吗?使用第一个正则表达式,然后用空字符串替换每个匹配项。亲爱的上帝。是的,那会有用的。我第一次使用正则表达式时感到非常激动,并开发了tunnel vision。谢谢,呸!当你意识到这比你想象的要容易时,那总是一种美好的感觉。很高兴我能提供帮助:)您应该考虑使用html解析器库来处理源代码。删除
span.notranslate
的内容比使用正则表达式要容易得多。此外,您还可以去掉所有html标记,只保留文本内容。您不能执行替换操作吗?使用第一个正则表达式,然后用空字符串替换每个匹配项。亲爱的上帝。是的,那会有用的。我第一次使用正则表达式时感到非常激动,并开发了tunnel vision。谢谢,呸!当你意识到这比你想象的要容易时,那总是一种美好的感觉。很高兴我能提供帮助:)您应该考虑使用html解析器库来处理源代码。删除
span.notranslate
的内容比使用正则表达式要容易得多。此外,您还可以去掉所有html标记,只保留文本内容。