0

我试图了解如何在一系列\s*:?\s*. 现在它会导致不需要的匹配,所以我被迫使用\s*:?\s+,但它不包括某些情况,例如todo:match.

为什么我需要这个:有一个待办事项评论检查是源代码分析工具,我想禁止使用普通的待办事项评论,但保留使用链接票编写待办事项评论的能力。

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

带星: 带星

无星: 在此处输入图像描述

来源: Debuggex 演示

(?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/
4

2 回答 2

1

您可以使用atomic groups,语法是(?>abc),它将\s*:\s*在正则表达式引擎第一次读取时禁止回溯并“固化”该部分。

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

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

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

于 2019-10-23T14:53:15.297 回答
1

根据您的评论,您希望仅允许带有票号或 URL 的 TODO 语句。这自然会根据票证的结构而有所不同,但以下应该有效。正则表达式假设您以不区分大小写的方式运行它们。

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

此正则表达式将匹配任何无效的待办事项:((?:todo|fixme)\s*:?\s*(?!http\S*)(?!.*\w+\-\d+).*$ 演示)这使用环视来确保匹配项中不存在票证或 URL 的模式。

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

于 2019-10-23T14:57:56.640 回答