2010-01-22 3 views
47

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

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

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

Я пробовал различные из них (будет перечислять их здесь позже, извините, нет доступа к ним прямо сейчас), но гаванью» пока он не работает.

+1

Я думаю, что на самом деле должен быть негативный внешний вид (не негативный взгляд в будущее). – Indrit

ответ

31

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

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

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

+0

Это тот, который мы могли бы использовать сейчас. Похоже, что существует проблема с расширенным регулярным выражением, но сейчас это отлично работает. –

103
^(?!my)\w+$ 

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

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

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

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

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

34
/^(?!my).*/ 

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

5

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

/^my/ 
+2

Это было бы проще, но это необходимо для правила, которое проверяет код при компиляции в репозиторий, поэтому логика не может быть «возвращена». –