正则表达式查找和替换标签中的文本

时间:2012-09-07 15:17:31

标签: c# regex text

我希望找到并替换不在标签内的文本。

标签很简单,并遵循以下模式:

(<[A-Z_]+>)([^<]+)(</[A-Z_]+>)
  • 第1组:打开标记
  • 第2组:标记内容
  • 第3组:结束标记

我需要查看的文字是这样的(每行一行,每行可能有多个标签):

What movie did The programmer watch if he didn't watch <NAME>The Office</NAME>?

我需要在“程序员”之前匹配“The”,而不是“&”之内的“The”。 NAME&gt;标签。我希望将其改为:

What movie did the programmer watch if he didn't watch <NAME>The Office</NAME>?

另一个例子,也许更好:

What movie did The programmer watch if he didn't watch <NAME>Dawn of the Dead - The Original Director's Cut</NAME>?

基本上,我正在寻找使用标签之外的文本来解决案例问题。我根本不想触摸标签内的任何文字。这是另一个例子:

Why Don't You watch <NAME>This is Spinal Tap</NAME> on <DAY>Friday</DAY> or whenever?

在那里,我想找到:

  • 不要

但不是“脊柱”等等,并以此结束:

Why don't you watch <NAME>This is Spinal Tap</NAME> on <DAY>Friday</DAY> or whenever?

我需要查看的所有字符串都是带有标记文本的句子放在字符串内的任何位置。没有标签重叠或包含另一个标签。

任何帮助都表示赞赏。甚至只是一个链接或指向正确路径的指针。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您的解决方案是:

Regex.Replace(s, @"((?<!^)\b[A-Z])(?=[^<>]+<[^\/>][^>]+>)", m => m.Value.ToLower());

检查this demo

答案 1 :(得分:-1)

试试这个正则表达式:

((?<!^|\.\s*)\b[A-Z])(?![^<>]+(?:<\/[^>]+)?>)

在此处Regexhero

进行测试

这将确保不匹配同一行中新句子的第一个大写单词 例如,The中的The movies was Not that great将不匹配。

  

如果他没看过The,程序员会看什么电影   办公室?。这部电影并不那么棒。