regex - 匹配第一个实例的正则表达式
问题描述
我有一个正则表达式(.*)?start((?!(foo|boo)).)* end test.*
。
它的作用是,如果在开始和结束测试之间没有foo或boo ,它将返回 true,否则返回false。它按预期工作。但我面临以下表达式的问题
start foo again start too anything anything end test
我的预期结果是错误的,因为foo
介于两者之间。不过貌似不是拿第一start
。
解决方案
考虑使用这种模式:
^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$
您当前的正则表达式失败的原因是初始(.*)?start
值实际上正在消耗start foo again
,因此绕过了负前瞻回火点,该点会检查它foo
并且boo
不会出现在两者之间。只有当单词 be not时,我的方法才会在开始时使用start
。这让您的逻辑按预期工作,我们可以断言既不foo
也不boo
出现在第一个start
和end test
文本之间。
请注意,我在几个地方添加了单词边界,并且还使组不捕获,假设您不想捕获任何东西。
演示
推荐阅读
- python-3.x - 我的 tkinter 代码会经常崩溃,我该如何让它更高效、更短?
- authentication - 使用 NSS 对 LDAP 用户进行身份验证
- java - 在 Maven 中央存储库上验证提供实体
- javascript - 如何使用反应钩子形式根据房间过滤数据数组学生
- javascript - 使用 p5 库时面向鼠标的旋转不正确
- python - 在 TensorFlow / Keras 中实现 3-Tensor (NHW) CNN
- wordpress - 如何为 gulp 构建 js 文件修复($ 不是函数)?
- android - 在重新打开片段时从相同位置继续媒体播放器
- c# - 根据验证程序,远程证书无效(身份服务器托管在 azure 中)
- android - Qt 为所有架构构建静态库