我在使用正则表达式时遇到了问题。我正在使用的正则表达式如下:
\\S*the[^o\\s]*(?<!theo)\\b
我使用的句子是:
如果世界说theo不是奥利奥饼干,那么thetatheoder、theotatheder、thetatheder就特别好吃。
我希望输出的模式是:the, then, thetatheder, extratheaterly?
简而言之,我接受’the(The)’作为完整字符串或不包含’theo’的字符串中的子字符串。
我该如何修改我的正则表达式来实现这个目标?我在考虑使用管道操作符或问号,但似乎这些方法都不太可行。
回答:
你可以使用\S
作为起始边界的负向后发断言,并使用负向先行断言确保单词中不包含theo。
为了匹配The或the,你可以使模式不区分大小写。
(?<!\S)(?!\S*theo\S*)\S*the\S*
分解如下
(?<!\S)
负向后发断言,确保左侧不是非空白字符(?!\S*theo\S*)
负向先行断言,确保右侧不包含theo
\S*the\S*
匹配the
,前后各匹配0次或多次非空白字符
如果你只使用单词字符,你也可以使用单词边界\b
\b(?!\w*theo\w*)\w*the\w*\b
或者你可以断言单词的一部分是the
,并使用断言匹配,如果匹配到t
,它后面不应跟着heo
\b(?=\S*the\S*)[^t\s]*(?:t(?!heo)[^t\s]*)+\b