Строка соответствия RegExp не начинается с моего

89

Для PMD я хотел бы иметь правило, которое предупреждает меня о тех уродливых переменных, которые начинаются с my.
Это означает, что я должен принять все переменные, которые НЕ начинаются с my.

Итак, мне нужен RegEx (re), который ведет себя следующим образом:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

Я пробовал разные, но пока не работает.

Доминик Санджая
источник
1
Я думаю, что на самом деле следует отрицательно смотреть назад (а не смотреть вперед).
Индрит

Ответы:

43

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

^(.?$|[^m].+|m[^y].*)

Это соответствует строкам, состоящим из нуля или одного символа ( ^.?$) и, следовательно, не может быть my. Или строки с двумя или более символами, где, когда первый символ не является, mмогут следовать другие символы ( ^[^m].+); или если первый символ - это, mон не должен сопровождаться знаком y( ^m[^y]).

Гамбо
источник
Это тот, который мы могли бы использовать сейчас. Похоже, есть проблема с расширенным регулярным выражением, но пока он работает нормально.
Dominik Sandjaja
165
^(?!my)\w+$

должно сработать.

Сначала он обеспечивает невозможность сопоставления myв начале строки, а затем сопоставляет буквенно-цифровые символы до конца строки. Пробел в любом месте строки приведет к сбою регулярного выражения. В зависимости от вашего ввода вы можете либо удалить пробелы в передней и задней части строки, прежде чем передавать ее в регулярное выражение, либо использовать добавление дополнительных сопоставителей пробелов в регулярное выражение, например ^\s*(?!my)(\w+)\s*$. В этом случае обратная ссылка 1 будет содержать имя переменной.

И если вам нужно убедиться, что имя вашей переменной начинается с определенной группы символов, скажем [A-Za-z_], используйте

^(?!my)[A-Za-z_]\w*$

Обратите внимание на изменение с +на *.

Тим Пицкер
источник
59
/^(?!my).*/

(?!expression)отрицательный взгляд вперед; он соответствует позиции, где expression не соответствует, начиная с этой позиции.

Янтарь
источник
7

Разве не было бы намного удобнее выполнять положительное сопоставление и отклонять эти строки, а не сопоставлять отрицательное, чтобы найти строки для принятия?

/^my/
Виктор Бруно
источник
4
Это было бы проще, НО это (было) необходимо для правила, которое проверяет код при фиксации в репозиторий, следовательно, логику нельзя «вернуть».
Dominik Sandjaja,