从字符串中选择未用双引号括起来的特定单词

时间:2016-07-26 18:21:43

标签: .net regex

我有一个像这样的字符串:

我们知道,“国家”的发展取决于人民和国家政府。

我需要一个正则表达式来检测特定的单词,说'the'没有用双引号括起来。经过一些随机尝试后我发现了这个((\。?)(the))。这会检测用双引号括起来的单词'the'以及不在引号之间的单词'the'。但我只想在上面的字符串中没有引号的单词'the'。经过多次尝试,我真的无法想出它。

我想要的是替换双引号之外的所有the并用'THE'重新表达它们但不希望双引号有任何变化。因此,如果用户写道,thetHEThE或任何组合)在引号之外找到,只是希望它转换为THE

2 个答案:

答案 0 :(得分:0)

使用lookarounds:

(?<!")the(?!")

答案 1 :(得分:0)

注意:此答案基于输入字符串中的引号是平衡的假设,并且没有转义引号。对于更复杂的语法,应该编写解析器。

您可以匹配内部没有双引号的非重叠引用子字符串,并跳过它们,同时通过捕获来处理所有其他the(外部双引号子字符串) {1}} 捕获群组

(...)

请参阅IDEONE demo

using System; using System.Linq; using System.Text.RegularExpressions; using System.IO; public class Test { public static void Main() { var s = "As, we know that ThE development of \"the\" nation depends on people as well as The government of tHe country."; var res = Regex.Replace(s, @"""[^""]*""|(the)", m => m.Groups[1].Success ? m.Groups[1].Value.ToUpper() : m.Groups[0].Value, RegexOptions.IgnoreCase); // Set case insensitive mode Console.WriteLine(res); } } 模式可以将简单的引用子字符串与"[^"]*"|(the)匹配,也可以匹配并将"[^"]*"捕获到第1组中。

the检查组1是否匹配:如果匹配,我们得到一个带引号的子字符串,它将被插回到结果字符串中,否则m => m.Groups[1].Success ? m.Groups[1].Value.ToUpper() : m.Groups[0].Value将变为大写。