У меня было следующее регулярное выражение:
\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*
Который должен соответствовать регулярным выражениям, к сожалению, я обнаружил, что это регулярное выражение также соответствует этой строке кода:
var a = b / c; // comment
Из-за наличия символа деления /
и комментарий //
,
regex101 говорит, что это соответствует / c; /
Итак, что я пытался сделать, это добавить этот негативный взгляд следующим образом:
\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*(?!\/)
Я намеревался исключить те матчи, которые имеют /
персонаж после них.
Это не сработало!
И во время тестирования в regex101 Я вижу, что это на самом деле добавление ширины и соответствия / c; //
Поэтому я в конечном итоге адаптируюсь с добавленной шириной и пишу свое выражение так:
\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*(?!\/| |[a-z]|[A-Z])
Однако я не чувствую, что это правильно!
Так есть ли в любом случае, что я могу исключить те, которые имеют /
характер после них?
Ваша проблема в том, что пока двигатель делает шаги до последнего, кроме одного /
это видит другой /
который не должен быть там (негативный взгляд), поэтому он возвращается и отказывается от одного символа (теперь это точно до //
) он снова делает некоторые возвраты, так как у вас есть еще несколько паттернов. наконец, это расширяет соответствие на .*?
до одного символа и соответствует последнему /
теперь он доволен (?!\/)
принято
В этом случае вы должны указать двигателю не работать, а не возвращаться назад, вызвав атомарную группу:
(?>/.+?/)(?!/)[gimy]*
Изменено регулярное выражение для включения экранированных слешей:
(?m)/(?!/)[^/\\\n]*(?:\\.[^\n/\\]*)*/(?:[gmiy]+|\s|$)
Объяснение:
/ # regex starting delimiter
(?! / ) # no `/` after
[^/\\\n]* # negated character class including `/` `\` `\n` (zero or more times)
(?: \\ . [^\n/\\]* )* # an escaped character followed by any character excluding a new-line and `\` (zero or more times)
/ # regex ending delimiter
(?: [gmiy]+ | \s | $ ) # match any of these
Других решений пока нет …