Regex re отрицательный взгляд не исключает нескольких символов успешно - PullRequest
0 голосов
/ 14 апреля 2020

Ниже приведены 5 примеров, и я пытаюсь найти 3,4,5, исключая 1,2.

  1. AB C -ab c
  2. ab c -AB C
  3. AB C -AB C
  4. AB C
  5. vAB C -AB C -ABCv

Текущее выражение, которое я использую:

(?!(\w*[A-Z]{2,}-[a-z]+\w*|\w*[a-z]+-[A-Z]{2,}\w*))(\w*-?[A-Z]{2,}-?\w*)
  • Я использую (\ w * -? [AZ] {2,} -? \ W * ) сначала получить все возможности всех примеров.
  • Затем я использую (?! ... | ...), чтобы поставить два условия исключения.
  • Первое условие исключения - \ w * [AZ] {2,} - [az] + \ w *, а второе - \ w * [az] + - [AZ] {2,} \ w *.
  • Это выражение работает для исключения 1 .AB C -ab c, но не ab c -AB C.

Я много искал и обнаружил, что некоторые люди говорят, что это не то, что регулярное выражение "хорошо" в. Есть ли какое-либо решение или улучшение, которое я могу сделать, чтобы избавиться от ab c -AB C.

Благодарю за любую помощь или мнение.

1 Ответ

0 голосов
/ 14 апреля 2020

Как я понимаю, строки должны быть отклонены, если они содержат дефис, которому предшествует строчная буква, за которой следует заглавная буква, или наоборот; иначе они должны быть приняты. Если это так, можно использовать следующее регулярное выражение.

^(?!.*(?:[a-z]-[A-Z]|[A-Z]-[a-z]))

Demo

Механизм регулярных выражений выполняет следующие операции.

^                # match beginning of line
(?!              # begin a negative lookahead
  .*             # match 0+ characters
  (?:            # begin a non-capture group
    [a-z]-[A-Z]  # match a lc letter, '-', uc letter
    |            # or
    [A-Z]-[a-z]  # match an uc letter, '-', lc letter
  )              # end non-capture group
)                # end negative lookahead
...