我使用C#。我有一个字符串:
wordA wordB wordC wordB wordD
我需要匹配wordA和wordD之间出现的所有wordB。 我使用lookahead和lookbehind匹配wordA和worD之间的所有内容,如下所示:
(?<=wordA)(.*?)(?=wordD)
但是像
(?<=wordA)(wordB)(?=wordD)
什么都不匹配。 在wordA和wordD之间匹配所有出现的wordB的最佳方法是什么?
答案 0 :(得分:4)
将.*?
放入外观:
(?<=wordA.*?)wordB(?=.*?wordD)
请参阅regex demo
现在,模式意味着:
(?<=wordA.*?)
- (一个积极的外观)要求wordA
后面跟着任何0+字符(尽可能少)... ... wordB
- 字B (?=.*?wordD)
- (一个积极的向前看)需要存在任何0+字符(尽可能少),然后是wordD
之后(因此,它可能在{{1}之后或者在某些字符之后)。如果您需要考虑多行输入,请使用wordB
标记编译正则表达式,以便RegexOptions.Singleline
可以匹配换行符号(或者使用.
内联修饰符选项添加模式 - { {1}})。
如果“单词”由字母/数字/下划线组成,并且您需要将它们作为整个单词匹配,请不要忘记将(?s)
,(?s)(?<=wordA.*?)wordB(?=.*?wordD)
和wordA
包括在内wordB
s(字边界)。
始终在目标环境中测试您的正则表达式:
wordD
请参阅C# demo。