Regex для любого слова, квадратной скобки, asc, ИЛИ desc ИЛИ любой другой строки, разделенных запятой, квадратной скобкой - PullRequest
0 голосов
/ 27 ноября 2018

Я борюсь с регулярным выражением для следующей конструкции.Предпочтительным языком является Java.

любое слово, квадратная скобка, asc ИЛИ desc ИЛИ любая другая строка (и), разделенные запятой (но если есть несколько слов, разделенных запятой, asc или desc не могуттам), квадратная скобка

Я придумал это, но это не работает правильно.

^.*?\[(asc|desc|([a-zA-Z0-9]+,?)+?)\]$

Данные тестирования:

hl[asc]
dd[desc]
pa[asc]
ldka[1azqmrueq0081po5uc1g16jot,1azqmrueq0081po5uc1g16jot,default]
poa[3oihkx5wfar7qu9nvqruhrn17]
ppa[dspxu1o2l06bzbh84m9luu701,f8ir6cuq4unhgi0a4kqjwidb0]

Данные тестирования не совпадают:

bb[asc,]
ca[desc,]
dd[asc,1azqmrueq0081po5uc1g16jot]
ge[1azqmrueq0081po5uc1g16jot,desc]

1 Ответ

0 голосов
/ 27 ноября 2018

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

^(?![^[]+\[[^]]*(?:\w+,\s*\b(?:asc|desc)\b|\b(?:asc|desc)\b,\s*\w+)[^]]*\]).+$

В Java:

String regex = "^(?![^\\[]+\\[[^]]*(?:\\w+,\\s*\\b(?:asc|desc)\\b|\\b(?:asc|desc)\\b,\\s*\\w+)[^]]*\\]).+$";

Regex demo

Объяснение

  • ^ Утверждение начала строки
  • (?! Отрицательный взгляд
  • [^[]+\[[^]]*(?:\w+,(?:asc|desc)|(?:asc|desc),\w+)[^]]*\] Детали:
    • [^[]+ Класс отрицательных символов не соответствует [ 1+ раз
    • \[ Совпадение буквально
    • [^]]* Класс отрицательных символов не соответствует ] 0+ раз
    • (?: Группа без захвата с чередованием для совпадения либо
      • \w+,\s*\b(?:asc|desc)\b Соответствует 1+ символам словапосле запятой и asc или desc
      • | или
      • \b(?:asc|desc)\b,\s*\w+ Совпадение asc или desc, за которым следуют запятая и 1+ слова слова
    • ) Закрыть группу без захвата
    • [^]]* Класс отрицательных символов не соответствует ] 0+ раз
    • \] Совпадение ] буквально
  • ) Закрыть отрицательный прогноз
  • .+ Совпадение с любым символом 1+ раз
  • $ Утверждение конца строки

Демонстрация Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...