我使用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.Singleline
flag编译正则表达式,以便.
可以与换行符匹配(或在模式前加上(?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#演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句