用于匹配单词的所有实例的正则表达式,除了包含该单词的特定超字符串

问题描述 投票:1回答:3

我正在研究一个正则表达式,它匹配一个单词的所有实例,除了包含该单词的特定字符串。

例如,我想匹配以下句子中stack的所有实例,除了stack.overflow(因为它后面是.overflow)并用stack替换STACK

这是堆栈溢出的一堆页面。有时也称为stack.overflow.com

执行替换操作后,上面的句子应如下所示:

这是STACK溢出页面的堆栈。有时也称为stack.overflow.com

编辑:

为了澄清一些混淆,我希望将所有包含stack的字符串全部匹配,除了stack后跟.overflow的特定情况。例如,以下句子

我堆叠了这个堆叠堆栈并重新堆叠(再次stacked)但没有stack.overflow但stack.overflow和restacked.overflow

应该

我堆叠了这个STACKing STACK并重新堆叠(再次强制它)但没有stack.overflow但是STACKed.overflow和reSTACKed.overflow

c# regex
3个回答
3
投票

使用负向前瞻。

\bstack(?!\.overflow)

为了使它不区分大小写使用RegexOptions.IgnoreCase标志。

带有Regex.Replace的C#示例代码,其中标志被替换为内联(?i)选项:

var res = Regex.Replace(input, @"(?i)\bstack(?!\.overflow)", "STACK");

证明:


1
投票
System.Text.RegularExpressions.Regex.Replace("This is a stack of pages on stack overflow. Sometimes also referred to as stack.overflow.com"
    ,"stack(?!\.overflow)"
    ,"STACK")

这适合我。 (不包括匹配后跟“.overflow”。)


0
投票

很简单:使用外观!它们匹配单词的开头和结尾。

(?<=\s|^)stack(?=\s|\.$)

我不能给你一个整体的演示,因为Javascript不支持lookbehinds,但请参阅here。然后你可以得到你的匹配,并用toUpper替换它。

说明

qazxsw poop在单词之前查找空格或字符串的开头。

(?<=\s|^)在单词后面查找空格或点以及字符串的结尾。

© www.soinside.com 2019 - 2024. All rights reserved.