6

Я решил изучить основы регулярных выражений. Я использую уроки Regex One в Интернете, и некоторое время я застрял на уроке 11 , но я думаю, что получил это сейчас.

Это была задача.

Msgstr "Написать регулярное выражение, которое соответствует только именам файлов (не включая расширение) файлов PDF ниже."

task            text                     capture
capture text    file_a_record_file.pdf   file_a_record_file
capture text    file_yesterday.pdf       file_yesterday
skip text       testfile_fake.pdf.tmp

Существует поле ввода, в котором вы вводите шаблон для выполнения задачи. После некоторых проб и ошибок это то, что я придумал.

^(file_a_record_file)\.pdf$

Это будет соответствовать имени файла file_a_record_file.pdf, но только "захватить" file_a_record_file. Какая разница? ... между соответствием и "захватом"? И как это полезно? Как это "групповое соответствие"?

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

^(file_.*)\.pdf$

Поскольку оба имени файла начинаются с file_, я подумал, что было бы неплохо сравнить с этим, а затем сказать ему, чтобы он совпадал с любым последующим символом, а затем выйти из группы с круглыми скобками ("group" - это то, что находится внутри скобок, верно ?) и экранируйте точку с обратной косой чертой и заканчивайте расширением имени файла.

Можно ли это описать более жестко? Правильные решения не приведены на сайте. Поэтому мне нечего сравнивать мои ответы. Жаль, потому что я думаю, что это хорошее введение в регулярные выражения. Примеры, приведенные для каждого урока, иногда трудно понять.

И снова, как это полезно? Он упоминает что-то о командной строке, я думаю, он имеет в виду, что она может быть использована для повторного использования команд или что-то в этом роде ... ну, я не совсем понимаю, что он говорит.

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

Извлечение информации? О чем он говорит? Может кто-нибудь сказать мне, как это полезно и привести пример из реальной жизни?

2 ответа2

8

В уроке, на который вы ссылаетесь, вас попросят написать регулярное выражение, которое фиксирует имя файла этих двух

file_a_record_file.pdf
file_yesterday.pdf

и пропускает

testfile_fake.pdf.tmp

Самое простое регулярное выражение, чтобы сделать это

(.*)\.pdf$

Это означает сопоставить все, что заканчивается в .pdf но записать только имя файла.

Итак, почему захват полезен? Это зависит от программы, с которой вы используете эти регулярные выражения. Захват образцов позволяет сохранить то, что вы захватили, в качестве переменной. Например, используя Perl, первый захваченный шаблон равен $1 , второй $2 т. Д .:

echo "Hello world" | perl -ne '/(.+) (.+)/; print "$2 $1\n"'

Это выведет "world Hello", потому что первая круглая скобка захватила Hello а вторая захваченная world но тогда мы печатаем $2 $1 поэтому два совпадения инвертируются.

Другие реализации регулярных выражений позволяют ссылаться на захваченные шаблоны, используя \1 , \2 и т.д. Например, GNU sed:

echo "Hello world" | sed 's/\(.*\) \(.*\)/\2 \1/'

Итак, в целом, захват образцов полезен, когда вам нужно обратиться к этим шаблонам позже. Это называется ссылками и кратко объясняется немного позже в учебниках, которые вы делаете.

1

Короче один:

(.*)\.pdf$



Почему захват / группировка:

Когда вы передаете регулярное выражение в программу или используете его в своей программе, вам нужно хранить совпадения, вы используете группирование.

Взяв приведенный выше пример регулярного выражения, программа проверяет, совпадает ли регулярное выражение, и если да, то вы можете просто получить фразу, которую вы заключили в нее ( )

Демо-версия:

String stringToCheck = "example.pdf";           // Example string for testing
Pattern p = Pattern.compile("(.*)\.pdf$");      // Matching regex
Matcher m = r.matcher(stringToCheck);           // Java's own component to 'match' the string, proccessing is here
if (m.matches()) {                              // Check if the regex has matched
                                                // What? How to reterive the filename?
                                                // That's why we grouped our filename in the regex
    String filename = m.group(1);               // Reterive the first grouped part
    System.out.println(filename);               // Java's own way to print string, this is printing filename
}                                               // ??? PROFIT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .