Разница между двумя, казалось бы, похожими регулярными выражениями в MySQL — идентичные выходные данные

#mysql #sql #regex

Вопрос:

Я пытался обучить себя MySQL, и мне было интересно, может ли кто-нибудь объяснить разницу между использованием метасимволов регулярных выражений » * «и»?». Книга, которую я использую, описывает их как «совпадающие (0) или один экземпляр строк, предшествующих ему». Я попытался использовать оба, ища одно и то же в созданной мной практической таблице, и получил точно такой же результат, поэтому, если один из операторов должен быть жадным, а другой-нет, похоже, что это не всегда так с каждой таблицей.

Редактировать 1: Я включаю скриншот вывода, который я получил от»*», который показывает, что он соответствует утверждению формы «ax*» только a.

Правка 2: regex101.com не перечисляет MySQL как «аромат», и когда я пытаюсь сделать «al*» для Александры там, он говорит, что не соответствует ни одному из ароматов. Является ли тот факт, что MySQL Workbench возвращает Alexandra в качестве одного из выходных данных, чем-то специфичным для MySQL, что не относится ни к одному из этих других языков?

Комментарии:

1. Пришло время оставить эту книгу и попробовать regex101.com для регулярных выражений. У них есть объяснение написанного регулярного выражения и описание значений каждой части

2. Выражение "al*" будет соответствовать чему угодно со строчной буквой «а», что и показывает ваш вывод. Это "*" относится только к l .

3. @TimRoberts Теперь я вижу! Итак, это не сопоставление с «Ал» в начале «Александра», это сопоставление с «а» в конце!

Ответ №1:

Они не совсем одно и то же. "*" означает «0 или более». "?" означает «0 или 1», например «необязательно». Итак, учитывая «ax*b» и «ax?b»:

  • Ни один из них не будет соответствовать «а».
  • Оба будут соответствовать «ab».
  • Оба будут соответствовать «axb».
  • Только первый будет соответствовать «axxb» или «axxxxxxb».

Комментарии:

1. так это была опечатка? Кроме того, похоже, что из вывода, который я получил, оба также будут соответствовать только «а». Я просмотрел список имен и поискал имена с «Ал*» и » Ал?». Оба дали мне имена только с буквами » А «и без букв» л «в дополнение к именам как с» Ал » в этом порядке, так и в обратном порядке.

2. Если в книге говорится "*" , что соответствует 0 или одному экземпляру, то это неправильно. И регулярное "ax*b" выражение не будет соответствовать единственной строке «a».

3. Если вы хотите поиграть с этим, попробуйте такой веб-сайт, как regex101.com . Вы вводите свое выражение плюс некоторый пример текста, и он показывает вам результат. (Как уже предположил @astentx, я вижу.)

4. в Python я бы с вами согласился. Но я обнаружил, что это действительно произошло в MySQL. Я не знаю, есть ли что-то особенное в MySQL, что позволяет этому произойти.

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