正则表达式:我需要提取除字符串 `ignore` 之外的所有单词

Regex : I need to extract all words except the string `ignore`

以此为例

hello-world
ignore-good-morning-ignore
good-night-ignore

我尝试过负面展望和负面展望

^(?<!ignore)\S+(?!ignore)$

不过好像3个字都挑了

预期结果

hello-world
good-morning
good-night

实际结果

hello-world
ignore-good-morning-ignore
good-night-ignore

我建议交换逻辑并实际匹配您想要忽略的词并替换那些值,从而将字符串保留在预期输出中。例如:

(?<=\S)-ignore\b|\bignore-(?=\S)

在线查看demo。当我们将匹配的子字符串替换为空时,您可以在屏幕底部看到结果。


  • (?<=\S) - 断言位置前面有一个非空白字符的积极回顾。
  • -ignore\b - 匹配“-ignore”后跟单词边界。
  • | - 或者:
  • \bignore- - 匹配后跟 'ignore-'.
  • 的单词边界
  • (?=\S) - 断言位置的正先行后跟一个非空白字符。

请注意,如果您的字符串也可以只是 'ignore' 而没有其他任何内容,您也可以添加到交替中以捕获它。

如果你想捕获不同数量的多次出现,试试这个没有开始 ^ 和结束 $ 字符串标记的版本(这样我们就可以捕获所有内容):

(?!\bignore\b)\b(\w+)\b

其中:

  • (?!\bignore\b) - 否定前瞻断言我们将捕获的字符串不完全是单词“ignore”。
  • \b - 确保我们要捕获的单词是整个单词,而不是部分单词,例如“忽略”
  • (\w+) - 抓字
  • \b - 如上所述,确保我们能捕获整个单词

如果您使用 C#,您可以拆分字符串并跳过 ignore 个条目:

var words = new[]
{
  "hello-world",
  "ignore-good-morning-ignore",
  "good-night-ignore",
  "good-ignore-night",
};
foreach (var word in words)
{
  var word2 = string.Join("-", word.Split("-").Where(w => w != "ignore"));
  Console.WriteLine(word2);
}
/*
    Output:
      hello-world
      good-morning
      good-night
      good-night
*/

使用正则表达式,只有一种方法可以匹配除 a
之外的所有内容 某个字符串。

当然,拆分单词或短语以创建句段列表是完成此任务的必经之路,
将特定段与文本字符串匹配可能会有好处。

重要的是你不需要做很多字符串长度就可以得到一个匹配位置
算术,如果你要使用像拆分这样的东西。

对于正则表达式,唯一的方法是使用可以“跳过”单词或短语的引擎。 唯一可以做到这一点的 class 引擎是 Perl、PCRE 或 Python“regex”

事实上,他们发明了一种可以在匹配后跳过单词或短语的结构。
这是 (*SKIP) 结构。

初步检查包含跳过,因为这是使用
的示例 PCRE,我只是将一些代码重新用作函数调用 "(?1)" 来检查
遍历流时前面没有字。

如果您不能使用 Perl / PCRE 风格的引擎,您最好使用
你最喜欢的分割函数。

((?:-|\b)ignore(?:-|\b))(*SKIP)(?!)|(?:(?!(?1)).)+

https://regex101.com/r/Wy21OZ/1

   (                             # (1 start)
      (?: - | \b )
      ignore
      (?: - | \b )
   )                             # (1 end)
   (*SKIP)(?!)
 | 
   (?: 
     (?! (?1) ) .
   )+