регулярное выражение добавление ширины

У меня было следующее регулярное выражение:

\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*

Который должен соответствовать регулярным выражениям, к сожалению, я обнаружил, что это регулярное выражение также соответствует этой строке кода:

var a = b / c; // comment

Из-за наличия символа деления / и комментарий //,

regex101 говорит, что это соответствует / c; /

Итак, что я пытался сделать, это добавить этот негативный взгляд следующим образом:

\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*(?!\/)

Я намеревался исключить те матчи, которые имеют / персонаж после них.

Это не сработало!

И во время тестирования в regex101 Я вижу, что это на самом деле добавление ширины и соответствия / c; //

Поэтому я в конечном итоге адаптируюсь с добавленной шириной и пишу свое выражение так:

\/.*?(?<!\\\\)(\\\\\\\\)*+\/[gimy]*(?!\/| |[a-z]|[A-Z])

ссылка regex101

Однако я не чувствую, что это правильно!

Так есть ли в любом случае, что я могу исключить те, которые имеют / характер после них?

https://regex101.com/r/jR6vQ2/1

0

Решение

Обновление № 1

Ваша проблема в том, что пока двигатель делает шаги до последнего, кроме одного / это видит другой / который не должен быть там (негативный взгляд), поэтому он возвращается и отказывается от одного символа (теперь это точно до //) он снова делает некоторые возвраты, так как у вас есть еще несколько паттернов. наконец, это расширяет соответствие на .*? до одного символа и соответствует последнему / теперь он доволен (?!\/) принято

В этом случае вы должны указать двигателю не работать, а не возвращаться назад, вызвав атомарную группу:

(?>/.+?/)(?!/)[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

Живая демо

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]