Регулярное выражение для неудачных двойных тире в строке - PullRequest
1 голос
/ 03 июня 2019

У меня есть соглашение об именовании токенов (простых строк), которому необходимо следовать. Двойные черточки являются разделителями разных частей. Например:

  • ActiveDirectory--User--<LastName>--Password
  • ActiveDirectory--App--<DisplayName>--Secret

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

Соглашение о присвоении имен гласит, что токен должен содержать только a-z, A-Z, 0-9 или тире (-). Двойные тире не допускаются внутри <CustomName>.

Регулярное выражение

^ActiveDirectory--User--([a-zA-Z0-9-]*)--Password$

работает нормально, если в качестве ввода указан следующий токен

ActiveDirectory--User--Smith--Password

но он не проверяет двойные тире, как

ActiveDirectory--User--Sm--ith--Password.

В этом случае слово "Sm - ith" будет группой моего совпадения. Желаемое состояние должно быть таким, чтобы не было совпадения.

Я уже пытался использовать отрицательный Look Ahead (отрицание) в сочетании с обратными ссылками. Но я должен стать экспертом по регулярным выражениям, прежде чем решать такую ​​сложную задачу.

Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Если ваш токен может иметь начальный и конечный -, вы можете использовать

^ActiveDirectory--User--((?:(?!--)[a-zA-Z0-9-])*)--Password$

См. Демоверсию regex . Здесь (?:(?!--)[a-zA-Z0-9-])* соответствует 0 или более буквам ASCII, цифрам или дефисам, но не соответствует символу, если вместе со следующим символом оно равно --.

Если ваш токен не может начинаться / заканчиваться -, используйте

^ActiveDirectory--User--([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)--Password$

См. еще одно демо . Здесь [a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)* соответствует 1+ буквам / цифрам, а затем 0 или более повторений - и 1+ букв / цифр.

1 голос
/ 03 июня 2019

Все ли это нужно сделать в одном регулярном выражении?Если это так, то, вероятно, воспользуйтесь решением Виктора.Если вы пишете код, который может использовать более одного регулярного выражения, простым методом было бы просто бросить ваш код «без совпадения», если он соответствует:

".*--.+--.+--.+--.*"

Это должно соответствовать любой строке с 4 или болеенаборы двойных тире, что является вашей заявленной ошибкой.Кроме того, если вы разрешите использовать конечные / ведущие одиночные тире в соседних «токенах», у вас будет неясность в вашей грамматике.

...