Какой Regex я бы использовал для сопоставления имен файлов с форматом «число-текст-текст»? - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть код, который ищет папку, содержащую файлы исправлений SQL. Я хочу добавить имена файлов в массив, если они соответствуют следующему формату имени:

number-text-text.sql

Какое регулярное выражение я бы использовал, чтобы соответствовать number-text-text.sql?

Можно ли сделать так, чтобы Regex совпадал с именами файлов, где часть number имени файла находится между двумя числами? Если это так, что бы синтаксис Regex для этого?

Ответы [ 4 ]

1 голос
/ 09 ноября 2011

Ваше регулярное выражение должно быть:

(\d+)-[a-zA-Z]+-[a-zA-Z]+\.sql

Затем вы использовали бы первую захваченную группу, чтобы проверить, находится ли ваш номер между двумя желаемыми числами.Не пытайтесь проверить, находится ли число в диапазоне с регулярным выражением;сделать это в два этапа.Ваш код будет намного понятнее.

1 голос
/ 09 ноября 2011

Следующее регулярное выражение делает его на полпути:

\d+-[a-zA-Z]+-[a-zA-Z]+\.sql

Что касается совпадения в определенном диапазоне, то становится сложнее, поскольку регулярное выражение не имеет простого способа обработки диапазонов. Чтобы ограничить совпадение именем файла с числом от 2 до 13, это регулярное выражение:

([2-9]|1[0-3])-[a-zA-Z]+-[a-zA-Z]+\.sql
1 голос
/ 09 ноября 2011

Как насчет:

\d+-[^-]+-[^-]+\.sql

Редактировать: Вы хотите только буквы, так что здесь это без конкретных диапазонов.

\d+-[a-z]+-[a-z]+\.sql - Вы также захотите использовать флаг i, не уверен, как это делается в c #, но здесь он находится в js / perl:

/\d+-[a-z]+-[a-z]+\.sql/i

Диапазоны сложнее. Вот пример того, как соответствовать 0-255:

([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])

Таким образом, чтобы соответствовать (0-255) -text-text.sql, у вас будет это:

/^(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])-[a-z]+-[a-z]+\.sql/i

(я поместил цифры в группу без захвата и сопоставил их с начала строки, чтобы предотвратить частичное совпадение числа и в случае, если вы ожидаете нумерованные группы или что-то в этом роде).

Обычно каждый раз, когда вам нужна еще одна цифра, вам нужно будет добавить новое условие в это дело. Чем меньше цифра, которую вы хотите сопоставить, тем больше случаев вам понадобится. Какой желаемый минимум / максимум? AFAIK, нет простого способа сделать это динамически (хотя я хотел бы, чтобы кто-то показал мне, что я не прав в этом).

Простейшим способом обойти это было бы просто захватить цифры и использовать собственный синтаксис, чтобы увидеть, находится ли он в вашем диапазоне. Пример в js:

var match = filename.match(/(\d+)-[a-z]+-[a-z]+\.sql/i);
if(match && match[1] < maximumNumber && match[1] > minimumNumber){
    doStuff();
}
1 голос
/ 09 ноября 2011

Это должно работать:

select '4-dfsg-asdfg.sql' ~ E'^[0-9]+-[a-zA-Z]+-[a-zA-Z]+\\.sql$'

Это ограничивает текст простыми символами ASCII. Может или не может быть то, что вы хотите. Это проверено в PostgreSQL. Ароматы регулярных выражений сильно различаются между реализациями. Вы, наверное, знаете это?

Якоря в начале ^ и в конце $ являются необязательными, в зависимости от того, как вы собираетесь это сделать.

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