我有一个像这样的字符串:
我们知道,“国家”的发展取决于人民和国家政府。
我需要一个正则表达式来检测特定的单词,说'the'没有用双引号括起来。经过一些随机尝试后我发现了这个((\。?)(the))。这会检测用双引号括起来的单词'the'以及不在引号之间的单词'the'。但我只想在上面的字符串中没有引号的单词'the'。经过多次尝试,我真的无法想出它。
我想要的是替换双引号之外的所有the
并用'THE'重新表达它们但不希望双引号有任何变化。因此,如果用户写道,the
,tHE
,ThE
或任何组合)在引号之外找到,只是希望它转换为THE
。
答案 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
将变为大写。