您的正则表达式应按“原样”工作。假设它正在做你想要它做的事情。
wordA(\s*)wordB(?! wordc)
这意味着匹配后跟 0 个或更多空格,后跟 ,但如果后跟 。则不匹配。请注意 和 之间的单个空格,这意味着 它将不匹配,但会匹配。wordA
wordB
wordc
?!
wordc
wordA wordB wordc
wordA wordB wordc
以下是一些匹配项和关联的替换输出示例:
请注意,无论有多少个空格,都会替换所有匹配项。还有其他几点: -
(?! wordc)
是一个负面的展望,所以你不会匹配假设是有意的行(这就是为什么最后一行不匹配)。目前,您依靠后面的空格来匹配空格。您可能希望更精确并使用 .如果要在 wordc 之前匹配多个空格,则可以使用 0 个或更多空格,也可以用于 1 个或更多空格,具体取决于您的意图。当然,如果你确实想在wordB之后将行与wordc匹配,那么你不应该使用负面的后瞻。wordA wordB wordc
?!
(?!\swordc)
(?!\s*wordc)
(?!\s*+wordc)
*
将匹配 0 个或更多空格,以便匹配 wordAwordB。您可能需要考虑是否至少需要一个空格。+
(\s*)
- 括号表示捕获组。您是否出于某种原因将空格捕获到组?如果没有,您可以直接删除括号,即仅使用.\s
根据评论进行更新
你好,问题不在于表达式,而在于不被视为空格的HTML输出。这是一个Joomla网站。
保留原始正则表达式,您可以使用:
wordA((?:\s| )*)wordB(?!(?:\s| )wordc)
唯一的区别是正则表达式不匹配空格 OR 。我用代替,因为这更明确。请注意,正如我已经指出的那样,当wordB后面跟着一个空格和wordc时,负面的展望将不匹配。如果您想匹配多个空格,请参阅上面的评论。我还保留了空格周围的捕获组,如果您不希望这样做,请删除括号,如上所述。
wordc
\swordc
?!
匹配示例: