正则表达式。匹配两个词之间的特定词
问题描述:
我使用C#。我有一个字符串:正则表达式。匹配两个词之间的特定词
wordA wordB wordC wordB wordD
我需要匹配wordA和wordD之间所有出现的单词B. 我用前瞻和回顾后,以匹配这样wordA和词之间的一切:像
(?<=wordA)(wordB)(?=wordD)
什么东西匹配
(?<=wordA)(.*?)(?=wordD)
不过。 匹配wordA和wordD之间所有出现的wordB的最佳方式是什么?
答
把.*?
到lookarounds:
(?<=wordA.*?)wordB(?=.*?wordD)
现在,图案意味着:
-
(?<=wordA.*?)
- (正回顾后)需要的wordA
存在随后与任何0+字符(尽可能少)立即之前... -
wordB
- 字B -
(?=.*?wordD)
- (正超前)需要任何0+字符的存在(尽可能少),随后与后他们wordD
(因此,它可以wordB
后或一些字符之后是正确的)。
如果您需要考虑多输入,带RegexOptions.Singleline
标志编译正则表达式使.
可以匹配换行符号(或在前面加上(?s)
在线修改选项模式 - (?s)(?<=wordA.*?)wordB(?=.*?wordD)
)。
如果“言”组成的字母/数字/下划线的,你需要给他们匹配整个单词,不要忘了包裹wordA
,wordB
和wordD
与\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。
你似乎想要捕捉单词(因为它被括号包围)。如果是这样的话,你可以使用更多的通用变体'\ bfirst \ b。* \ b(second)\ b。* \ bthird \ b' [在regex101这里](https://regex101.com/R/SUYwrQ/2)。它适用于大多数正则表达式:)不同之处在于这个*匹配*从第一个单词到第三个单词的所有内容,但是*只捕获第二个单词。这可能是不必要的行为,如果是这样,@WiktorStribiżew给出的环视方法就可以做到。除了更通用之外,我不认为这对Wiktors有任何意义。 – ClasG