Не могу найти способ запретить моему регулярному выражению совпадать со словом в моем SQL-запросе - PullRequest
0 голосов
/ 04 апреля 2019

В основном я хочу сопоставить имя таблицы из запроса SQL. Запрос может быть объединенным запросом или обычным запросом с предложением where. Когда это соединение, я знаю, как сопоставить имя таблицы и ее псевдоним. Но когда это не объединение, я просто хочу найти имя таблицы и не соответствовать "где". Если мне не хватает места, нужно также указать имя таблицы.

Пока это мое регулярное выражение: "(? <= FROM | JOIN | ON) (\ s + \ w + \ b. \ W + | \ s + \ w + \ b | \ s + £ \ w + \ b) (\ s + \ ш +) "</p>

Это будет совпадать с именем таблицы перед именем from, join или на том же псевдониме.

То, что выберет псевдоним, - (\ s + \ w +), и я хочу исключить ГДЕ оттуда, я попытался [^ ГДЕ], но это не имеет последствий для результата. И я действительно не знаю, как еще я могу сделать то, с чем я пытался?! Где, но ничего не делает, это соответствует только имени таблицы и где.

(?<=FROM|JOIN|ON)(\s+\w+\b\.\w+|\s+\w+\b|\s+£\w+\b)(\s+\w+)

Это мое текущее регулярное выражение.

Вы можете проверить это здесь: https://regex101.com/r/01hUXM/1/

Я пытаюсь сопоставить «Таблица T1», «Таблица T2», «somwhere», «там».

И до сих пор я могу сопоставить только «Таблица T1» и «Таблица T2». Я не могу понять, как соответствовать двум другим. Если я попробую что-то вроде from\s+(\w+), оно также совпадет с теми, что в соединении, но без псевдонима, и я не хочу этого.

EDIT:

(<= С |? РЕГИСТРИРУЙТЕСЬ | ВКЛ) (\ S + \ W + \ Ъ \ W + |. \ S + \ W + \ Ъ | \ S + £ \ W + \ б) (\ S + \ W +) | от \ с ( \ ш +) </p>

Это основная идея, которую я хочу. Первый выбирает TableName и псевдоним, а второй - только OR tablename (в группе). Но по какой-то причине ИЛИ отменяет первый выбор, если он может быть применен к результату первого шаблона

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете использовать следующее регулярное выражение ( см. Его здесь) ) для захвата имен таблиц и их потенциальных псевдонимов, следующих сразу за from или join (с необязательным именем базы данных и именами схем перед таблицейназвание).Он также поймает ваш потенциальный случай, когда в качестве префикса имени таблицы стоит £:

(?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s+as\s+(\w+)|\s+(?!where\s+)(\w+))?

. Здесь показана базовая форма для этого регулярного выражения (поясняется ниже):

  • (?:from|join) соответствует from или join
  • \s+ соответствует одному или нескольким пробельным символам
  • ((?:\w+\.){0,2}£?\w+) захватывает следующие
    • (?:\w+\.){0,2} соответствуют следующему между нулямии два раза (соответствует database_name и / или schema_name, которые могут предшествовать table_name)
      • \w+ соответствует любому символу слова один или несколько раз
      • \. совпадений. буквально
    • £? опционально соответствует £ буквально
    • \w+ соответствует любому символу слова один или несколько раз (это table_name)
  • (?|\s+as\s+(\w+)|\s+(?!where\s+)(\w+))? опционально может соответствовать любому из следующих (это потенциальный псевдоним).(?|) - это группа сброса ответвлений - это делает группу захвата каждого варианта одинаковым номером (вторая группа захвата), без этого группа захвата варианта 1 будет иметь номер 2, а группа захвата варианта 3 будет иметь номер 3.
    • Вариант 1
      • \s+as\s+ соответствует любому символу пробела один или несколько раз, затем as, за которым следует любой символ пробела один или несколько раз
      • (\w+) захватить любое слово, символ одинили более раз во вторую группу захвата
    • Вариант 2
      • \s+ соответствует любому пробелу один или несколько раз
      • (?!where\b) отрицательный взглядубедитесь, что следующее не where (второе регулярное выражение ниже показывает, как вы можете расширить это, чтобы добавить дополнительные отрицания)
    • (\w+) захватить любой символ слова один или несколько раз во второмгруппа захвата

При желании вы также можете добавить \K к регулярному выражению (см. комментарий @ Wiktor для примера его использования, исключающего когда-либоДо первой группы захвата from).Он сбрасывает ваше совпадение на ноль (вместо того, чтобы получить что-то вроде from table t в качестве совпадения) - см. Здесь используется \K .

Вот второе регулярное выражение с расширенными условиями отрицания, чтобы охватить почти все в MySQL.

(?:from|join)\s+((?:\w+\.){0,2}£?\w+)(?|\s+as\s+(\w+)|\s+(?!(?:(?:(?:inner|cross)\s+)?join|(?:natural\s+)?(?:(?:left|right)\s+)?(?:outer\s+)?join|where|(?:group|order)\s+by|having|limit|into|union|on|for\s+update|select)\b)(\w+))?      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...