正则表达式。匹配两个词之间的特定词

问题描述:

我使用C#。我有一个字符串:正则表达式。匹配两个词之间的特定词

wordA wordB wordC wordB wordD 

我需要匹配wordA和wordD之间所有出现的单词B. 我用前瞻和回顾后,以匹配这样wordA和词之间的一切:像

(?<=wordA)(wordB)(?=wordD) 

什么东西匹配

(?<=wordA)(.*?)(?=wordD) 

不过。 匹配wordA和wordD之间所有出现的wordB的最佳方式是什么?

+0

你似乎想要捕捉单词(因为它被括号包围)。如果是这样的话,你可以使用更多的通用变体'\ bfirst \ b。* \ b(second)\ b。* \ bthird \ b' [在regex101这里](https://regex101.com/R/SUYwrQ/2)。它适用于大多数正则表达式:)不同之处在于这个*匹配*从第一个单词到第三个单词的所有内容,但是*只捕获第二个单词。这可能是不必要的行为,如果是这样,@WiktorStribiżew给出的环视方法就可以做到。除了更通用之外,我不认为这对Wiktors有任何意义。 – ClasG

.*?到lookarounds:

(?<=wordA.*?)wordB(?=.*?wordD) 

参见regex demo

现在,图案意味着:

  • (?<=wordA.*?) - (正回顾后)需要的wordA存在随后与任何0+字符(尽可能少)立即之前...
  • wordB - 字B
  • (?=.*?wordD) - (正超前)需要任何0+字符的存在(尽可能少),随后与后他们wordD(因此,它可以wordB后或一些字符之后是正确的)。

如果您需要考虑多输入,带RegexOptions.Singleline标志编译正则表达式使.可以匹配换行符号(或在前面加上(?s)在线修改选项模式 - (?s)(?<=wordA.*?)wordB(?=.*?wordD))。

如果“言”组成的字母/数字/下划线的,你需要给他们匹配整个单词,不要忘了包裹wordAwordBwordD\b S(字边界)。

在目标环境中始终测试您的正则表达式:

var s = "wordA wordB wordC wordB \n wordD"; 
var pattern = @"(?<=wordA.*?)wordB(?=.*?wordD)"; 
var result = Regex.Replace(s, pattern, "<<<$&>>>", RegexOptions.Singleline); 
Console.WriteLine(result); 
// => wordA <<<wordB>>> wordC <<<wordB>>> 
// wordD 

C# demo

+0

它在你给的演示中完美地工作。但是我在regex101.com上尝试类似的方法,但发现错误。不同的在线编译器有区别吗?我在这里保存了URL https://regex101.com/r/ORkgjg/1 – Utsav

+0

@Utsav:如果网站不支持,为什么要使用http://regex101.com测试**。NET **正则表达式.NET正则表达式语法?问题用C#标记。看到我添加到答案的C#演示。 –

+0

好的。没有意识到这一点。谢谢。 – Utsav