Регулярное выражение с отрицательным прогнозом работает с нулем или более предшествующими пробелами - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь понять, как заставить отрицательный взгляд исполниться после серии \s*:?\s*. Прямо сейчас это приводит к нежелательным совпадениям, поэтому я вынужден использовать \s*:?\s+, но он не охватывает некоторые случаи, например todo:match.

Зачем мне это нужно: есть комментарий todoПроверьте это инструмент анализа исходного кода, я хочу запретить использование простых комментариев TODO, но сохранить возможность писать комментарии todo со связанными билетами.

tl; dr: я хочу сделать лучшие примеры несопоставимыми, но соответствовать всемнижние примеры.

со звездой: With star

без звезды: enter image description here

Источник: 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/

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Согласно вашим комментариям, вы хотите разрешить только операторы TODO с номером билета или URL-адресом после них. Естественно, это будет зависеть от структуры заявки, но должно работать следующее. Регулярные выражения предполагают, что вы запускаете их без учета регистра.

Это регулярное выражение будет соответствовать любому допустимому todo: (?:todo|fixme):?\s*(?:\w+\-\d+|https\S*) (Демо)

Это регулярное выражение будет соответствовать любому неверному todo: (?:todo|fixme)\s*:?\s*(?!http\S*)(?!.*\w+\-\d+).*$ (Демо) При этом используются обходные пути, чтобы убедиться, что шаблоны заявок или URL-адресов отсутствуют в совпадениях.

Я не уверен, насколько отличаются fixme: https://jira.company.com и todo: match https://jira.company.com/ - второе регулярное выражение соответствует обоим.

1 голос
/ 23 октября 2019

Вы можете использовать атомные группы , синтаксис (?>abc), он запрещает возврат и "отвердение" части \s*:\s* при первом ее чтении с помощью механизма регулярных выражений.

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

(я упростил часть jira, вы можете обновить при необходимости)

Тест на https://regex101.com/r/XNPtQS/1

...