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].+); або якщо першим символом є a, за mним не повинен йти символ y( ^m[^y]).


Це той, який ми могли б використати зараз. Здається, що є проблема з розширеним регулярним виразом, але наразі він працює нормально.
Домінік Санджая

165
^(?!my)\w+$

повинні працювати.

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

І якщо вам потрібно переконатися, що ім’я змінної починається з певної групи символів, скажімо [A-Za-z_], використовуйте

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

Зверніть увагу на зміну з +на *.


59
/^(?!my).*/

(?!expression)є негативним результатом; він відповідає позиції, де expression не збігається, починаючи з цієї позиції.


7

Хіба не було б набагато зручніше зробити позитивний збіг і відхилити ці рядки, а не збігатися з негативним, щоб знайти рядки, які потрібно прийняти?

/^my/

4
Це було б простіше, АЛЕ це (потрібно) було для правила, яке перевіряє код під час комітування у сховищі, отже, логіка не може бути "повернута".
Домінік Санджая,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.