1

我正在寻找和替换不在标签内的文本。

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

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

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

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

我需要在“programmer”之前匹配“The”,而不是 <NAME> 标签内的“The”。我希望将其更改为:

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?

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

任何帮助都将不胜感激。甚至只是一个链接或指向正确路径的指针就跑下来了。

提前致谢!

4

2 回答 2

1

您的解决方案是:

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

检查这个演示

于 2012-09-07T15:41:28.500 回答
-1

试试这个正则表达式:

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

Regexhero进行测试

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

如果程序员不看办公室,他会看什么电影?这部电影不是那么好。

于 2012-09-07T17:09:22.023 回答