具有负前瞻性的正则表达式确实适用于零个或多个前面的空格

Regex with negative lookahead does work with zero or more preceeding whitespaces

我正在尝试了解如何在 \s*:?\s* 系列之后执行否定前瞻。现在它会导致不需要的匹配,所以我不得不使用 \s*:?\s+,但它不包括某些情况,例如todo:match.

我为什么需要这个:有一个 todo 注释检查是源代码分析工具,我想禁止使用普通 TODO 注释,但保留使用链接票证编写 todo 注释的能力。

tl;dr:我想让顶级示例无与伦比,但匹配所有底部示例。

加星:

没有加星:

来源: Debuggex Demo

(?ix)(?:fixme|todo)
\s*(?::|-|--)?\s+
(?!(?:(?:https|http):\/\/)?(?:www\.)?jira\.company\.com|\w+-\d+)

测试数据:

TODO: AS-123 no match
todo: as-123 no match
fixme: https://jira.company.com/browse/AS-14965 no match
fixme: https://jira.company.com
fixme as-123 no match
todo:as-123 no match


todo match
todo        match
todo:match
todo :match
todo123
todo : match
todo: match
fixme: match
todo: match https://jira.company.com/

你可以使用原子组,语法是(?>abc),它会禁止回溯和"solidify"第一次\s*:\s*部分它由正则表达式引擎读取。

(?i)(todo|fixme)(?>\s*:?\s*)(?!http|\w+-\d+).*

(我简化了jira部分,你可以根据需要升级)

测试https://regex101.com/r/XNPtQS/1

根据您的意见,您希望只允许在 TODO 语句后加上票号或 URL。这自然会根据工单的结构而有所不同,但以下应该有效。正则表达式假设您 运行 它们不区分大小写。

此正则表达式将匹配任何有效待办事项:(?:todo|fixme):?\s*(?:\w+\-\d+|https\S*) (Demo)

这个正则表达式将匹配任何无效待办事项:(?:todo|fixme)\s*:?\s*(?!http\S*)(?!.*\w+\-\d+).*$ (Demo)这使用环视来确保票证或URL的模式是没有出现在比赛中。

不过我不确定 fixme: https://jira.company.comtodo: match https://jira.company.com/ 有何不同 - 第二个正则表达式匹配两者。