首页 > 解决方案 > 匹配第一个实例的正则表达式

问题描述

我有一个正则表达式(.*)?start((?!(foo|boo)).)* end test.*

它的作用是,如果在开始结束测试之间没有fooboo ,它将返回 true,否则返回false。它按预期工作。但我面临以下表达式的问题

start foo again start too anything anything end test

我的预期结果是错误的,因为foo介于两者之间。不过貌似不是拿第一start

标签: regexscalaapache-spark

解决方案


考虑使用这种模式:

^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$

您当前的正则表达式失败的原因是初始(.*)?start值实际上正在消耗start foo again,因此绕过了负前瞻回火点,该点会检查它foo并且boo不会出现在两者之间。只有当单词 be not时,我的方法才会在开始时使用start。这让您的逻辑按预期工作,我们可以断言既不foo也不boo出现在第一个startend test文本之间。

请注意,我在几个地方添加了单词边界,并且还使组不捕获,假设您不想捕获任何东西。

演示


推荐阅读