C# 如何避免特定字符串模式被Regex.replace()替换

C# 如何避免特定字符串模式被Regex.replace()替换,c#,regex,string,C#,Regex,String,我有一根像 巴基斯坦,官方 现在我正在使用 System.Text.RegularExpressions.Regex.ReplaceinputText,\\bPakistan\\b,某物; 以取代巴基斯坦以外的标签。但我不想取代巴基斯坦在世界范围内的地位。我无法正确地添加指向巴基斯坦共和国这样的字符串的链接,巴基斯坦也是该数组中的另一个字符串。如果您试图在HTML语法上下文中执行某些操作,请使用HTML解析器。如果您试图在HTML语法上下文中执行某些操作,使用HTML解析器。将每行文本转换为字符

我有一根像 巴基斯坦,官方

现在我正在使用 System.Text.RegularExpressions.Regex.ReplaceinputText,\\bPakistan\\b,某物;
以取代巴基斯坦以外的标签。但我不想取代巴基斯坦在世界范围内的地位。我无法正确地添加指向巴基斯坦共和国这样的字符串的链接,巴基斯坦也是该数组中的另一个字符串。

如果您试图在HTML语法上下文中执行某些操作,请使用HTML解析器。

如果您试图在HTML语法上下文中执行某些操作,使用HTML解析器。

将每行文本转换为字符串a

删除之间的位并将其存储在字符串B中

在字符串A中的剩余文本上运行正则表达式


返回A+B

将每行文本转换为字符串A

删除之间的位并将其存储在字符串B中

在字符串A中的剩余文本上运行正则表达式


返回A+B

以下是如何执行与要求相反的操作,只替换标记内的实例:

content = Regex.Replace(content, @"(?<=\<\s*a[^>]+)\bPakistan\b(?=.*?\>)", "India");
这是非常未经测试,不是你想要的,但它可以给你一些提示。这使用了。我相信还有很多其他的方法

这真的是在突破正则表达式的极限。您可能应该使用HTML解析器

编辑:使用负查找,这似乎有效。请测试它!:

content = Regex.Replace(content, @"(?<!\<\s*a[^>]+)\bPakistan\b", "India");

以下是如何执行与要求相反的操作,只替换标记内的实例:

content = Regex.Replace(content, @"(?<=\<\s*a[^>]+)\bPakistan\b(?=.*?\>)", "India");
这是非常未经测试,不是你想要的,但它可以给你一些提示。这使用了。我相信还有很多其他的方法

这真的是在突破正则表达式的极限。您可能应该使用HTML解析器

编辑:使用负查找,这似乎有效。请测试它!:

content = Regex.Replace(content, @"(?<!\<\s*a[^>]+)\bPakistan\b", "India");

虽然@Chris solution在这里不起作用,但您可以这样使用

string content = "Pakistan is <a href=\" Pakistan is\">Pakistan an islamic country</a>";
string content2= Regex.Replace(content,@"\bPakistan\b", "India");
string content3 = Regex.Replace(content2, @"(?<=\<\s*a[^<]+)\bIndia\b(?=.*?\>)", "pakistan");        
Console.WriteLine(content3);    

但这不是一个非常有效的解决方案。

尽管@Chris solution在这里并不完全有效,但您可以这样使用

string content = "Pakistan is <a href=\" Pakistan is\">Pakistan an islamic country</a>";
string content2= Regex.Replace(content,@"\bPakistan\b", "India");
string content3 = Regex.Replace(content2, @"(?<=\<\s*a[^<]+)\bIndia\b(?=.*?\>)", "pakistan");        
Console.WriteLine(content3);    

但这不是一个非常有效的解决方案。

对于问题的第一部分,我将匹配一个链接或目标词:

Regex r = new Regex(@"<a\s+.*?</a>|\bPakistan\b");

请记住,替换返回的是第一个匹配的替换,而不是最长的。如果备选方案A是备选方案B的前缀,则B应列在A之前。例如,在您的列表中,中东应排在中间位置之前。

对于问题的第一部分,我将匹配链接或目标词:

Regex r = new Regex(@"<a\s+.*?</a>|\bPakistan\b");


请记住,替换返回的是第一个匹配的替换,而不是最长的。如果备选方案A是备选方案B的前缀,则B应列在A之前。例如,在列表中,中东应列在中间位置之前。

标记的位置将丢失。不,不会丢失,您需要显示一个简单的代码示例,其中包含一些清晰的示例数据。您在该字符串中是正确的,不会丢失。但是不一定会出现在最后,并且有不止一个块。是的:那么给我们展示一些代码和一些有用的测试数据,这样我们就有机会在所有场景中更好地帮助您!标记的位置将丢失。不,不会丢失,您需要显示一个简单的代码示例,其中包含一些清晰的示例数据。您在这个字符串中是正确的,它不会丢失。但是不一定会出现在最后,并且有不止一个块。是的:那么给我们展示一些代码和一些有用的测试数据,这样我们就有机会在所有场景中更好地帮助您!C正则表达式是否允许在负lookbehind中使用可变宽度表达式?大多数支持lookbehinds的正则表达式引擎都不允许使用可变宽度表达式,因为不知道尝试匹配它们的步距有多远。我对零宽度的理解可能存在缺陷,即它意味着断言没有捕获任何内容。位于的.NET regex示例似乎使用了可变宽度表达式:?@Dav:.NET在regex风格中几乎是独一无二的,因为您可以在lookback中使用任何您喜欢的表达式@克里斯:更正确的说法是,像lookback这样的零宽度断言不会消耗任何东西。捕获是另一回事。我像这样使用inputText=Regex.ReplaceinputText,@?C正则表达式是否允许在负lookbehind中使用可变宽度表达式?大多数支持lookbehinds的正则表达式引擎都不允许使用可变宽度表达式,因为不知道尝试匹配它们的步距有多远。我对零宽度的理解可能存在缺陷,即它意味着断言没有捕获任何内容。位于的.NET regex示例似乎使用了可变宽度表达式:?@Dav:.NET在regex风格中几乎是独一无二的,因为您可以在lookback中使用任何您喜欢的表达式@克里斯:更正确的说法是,像lookback这样的零宽度断言不会消耗任何东西。捕获是另一回事。我像这样使用inputText=Regex.ReplaceinputText,@?可能不是很有效,但很容易理解和实现。ThanksI是这样使用的inputText=Regex.R
eplaceinputText,@?可能效率不高,但易于理解和实现。ThanksI是这样使用的inputText=Regex.ReplaceinputText,@?