常用表达。在两个词之间匹配特定词

伊利亚·伊万尼茨基(Ilya Ivanitsky)

我使用C#。我有一个字符串:

wordA wordB wordC wordB wordD

我需要匹配wordA和wordD之间所有出现的wordB。我使用lookahead和lookbehind来匹配wordA和worD之间的所有内容,如下所示:

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

但是类似

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

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

维克多·史翠比维

放入.*?环顾四周:

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

正则表达式演示

现在,该模式表示:

  • (?<=wordA.*?)-(向后看是积极的)要求wordA紧接在...之前紧随其后的是0+字符(尽可能少)。
  • wordB -字B
  • (?=.*?wordD)-(正向超前)要求存在0个以上的字符(尽可能少)wordD,后wordB接一个字符(因此,可以紧接在某些字符之后或之后)。

如果需要考虑多行输入,请使用RegexOptions.Singlelineflag编译正则表达式,以便.可以与换行符匹配(或在模式前加上(?s)内联修饰符选项- (?s)(?<=wordA.*?)wordB(?=.*?wordD))。

如果“单词”由字母/数字/下划线组成,并且您需要将它们作为整个单词进行匹配,请不要忘记将wordAwordBwordD换成\bs(单词边界)。

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

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#演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章