Варианты использования для регулярного выражения найти / заменить
Я недавно обсуждал редакторов с коллегой. Он использует один из менее популярных редакторов, а я - другой (я не буду говорить, какие из них, потому что это не актуально, и я хочу избежать войны пламени редактора). Я говорил, что мне не очень нравится его редактор, потому что он не позволяет вам найти / заменить регулярными выражениями.
Он сказал, что никогда не хотел этого делать, что было удивительно, потому что я постоянно этим занимаюсь. Тем не менее, изо всех сил я не смог придумать более одного или двух примеров. Может ли кто-нибудь здесь привести примеры, когда они находят регулярное выражение находить / заменять полезным в своем редакторе? Вот то, что я смог придумать с тех пор как примеры того, что мне действительно пришлось сделать:
Уберите начало строки каждой строки в файле, который выглядит следующим образом:
Line 25634 :
Line 632157 :
Возьмите несколько десятков файлов со стандартным заголовком, который немного отличается для каждого файла, и уберите первые 19 строк из всех сразу.
Скопировать результат оператора MySQL select в текстовый файл, затем удалить все ненужные файлы форматирования и переформатировать их в словарь Python для использования в простом скрипте.
В CSV-файле без экранированных запятых замените первый символ 8-го столбца каждой строки на заглавную A.
Учитывая кучу трассировок стека GDB с такими строками, как
#3 0x080a6d61 in _mvl_set_req_done (req=0x82624a4, result=27158) at ../../mvl/src/mvl_serv.c:850
вырезать все из каждой строки, кроме имен функций.
У кого-нибудь еще есть примеры из жизни? В следующий раз, когда это произойдет, я хотел бы быть более подготовленным, чтобы перечислить хорошие примеры того, почему эта функция полезна.
10 ответов
Вчера я взял оператор создания таблицы, который я сделал для таблицы Oracle, и преобразовал поля в вызовы метода setString(), используя JDBC и PreparedStatements. Имена полей таблицы были сопоставлены с моими свойствами класса, поэтому поиск и замена регулярных выражений идеально подходили.
Создать текст таблицы:
...
field_1 VARCHAR2(100) NULL,
field_2 VARCHAR2(10) NULL,
field_3 NUMBER(8) NULL,
field_4 VARCHAR2(100) NULL,
....
Мой поиск по регулярному выражению:
/([a-z_])+ .*?,?/
Моя замена:
pstmt.setString(1, \1);
Результат:
...
pstmt.setString(1, field_1);
pstmt.setString(1, field_2);
pstmt.setString(1, field_3);
pstmt.setString(1, field_4);
....
Затем я прошел и вручную установил позицию int для каждого вызова и изменил метод на setInt() (и другие), где это необходимо, но для меня это сработало. Я фактически использовал это три или четыре раза для аналогичных преобразований вызовов методов.
Regex позволяет легко заменить целые слова, используя границы слов.
(\b\w+\b)
Таким образом, вы можете заменить ненужные слова в вашем файле, не мешая таким словам, как Scunthorpe
Буквально на прошлой неделе я использовал regex find/replace для преобразования файла CSV в файл XML.
Достаточно просто, чтобы сделать это на самом деле, просто нарежьте каждое поле (к счастью, у него не было экранированных запятых) и вытолкните его обратно с соответствующими тегами вместо запятых.
Я только что вставил длинную последовательность символов в строковый литерал, и теперь я хочу разбить ее на конкатенацию более коротких строковых литералов, чтобы она не переносилась. Я также хочу, чтобы он был читабельным, поэтому я хочу разбивать только после пробелов. Я выбираю всю строку (за исключением кавычек) и выполняю замену всего в выборке с помощью этого регулярного выражения:
/.{20,60} /
... и эта замена:
/$0"¶ + "/
... где Пикроу - это настоящая новая строка, а количество пробелов варьируется от одного инцидента к другому. Результат:
String s = "I recently discussed editors with a co-worker. He uses one "
+ "of the less popular editors and I use another (I won't say "
+ "which ones since it's not relevant and I want to avoid an "
+ "editor flame war). I was saying that I didn't like his "
+ "editor as much because it doesn't let you do find/replace "
+ "with regular expressions.";
Одна вещь, для которой я все время использую ее в веб-разработке, это удаление некоторого текста из его HTML-тегов. Это может потребоваться для очистки входных данных пользователя в целях безопасности или для предварительного просмотра новостной статьи. Например, если у вас есть статья с большим количеством HTML-тегов для форматирования, вы не можете просто сделать ВЛЕВО (article_text,100) + '...' (плюс ссылку "читать дальше") и отобразить ее на странице в риск разбить страницу, разделив HTML-тег.
Кроме того, мне пришлось удалить теги img в записях базы данных, которые ссылаются на изображения, которые больше не существуют. И давайте не будем забывать проверку веб-формы. Если вы хотите, чтобы пользователь ввел правильный адрес электронной почты (синтаксически говоря) в веб-форму, это единственный способ тщательно проверить его.
Мне нравится использовать регулярные выражения для переформатирования списков элементов, таких как это:
int item1
double item2
в
public void item1(int item1){
}
public void item2(double item2){
}
Это может сэкономить много времени.
Я использую его все время, когда кто-то посылает мне список номеров посещений пациентов в столбце (скажем, 100-200), и они мне нужны в формате "0000000444", "000000004445". творит чудеса для меня!
Я также использую это, чтобы вытащить адреса электронной почты в электронном письме. Я часто рассылаю групповые электронные письма, и все возвращенные ответы возвращаются в одном письме. Итак, я регулярное выражение, чтобы вытащить их все, а затем поместить их в строку var для удаления из базы данных.
Я даже написал небольшую диалоговую прогу для применения регулярных выражений в моем буфере обмена. Он захватывает содержимое, применяет регулярное выражение и затем загружает его обратно в буфер обмена.
Regex очень удобен в любое время, когда я пытаюсь заменить значение, которое занимает несколько строк. Или когда я хочу заменить значение чем-то, что содержит разрыв строки.
Мне также нравится, что вы можете сопоставлять вещи в регулярном выражении и не заменять полное совпадение, используя синтаксис $# для вывода той части совпадения, которую вы хотите сохранить.
Я согласен с вами по пунктам 3, 4 и 5, но не обязательно по пунктам 1 и 2.
В некоторых случаях 1 и 2 легче достичь с помощью макроса анонимной клавиатуры.
Под этим я подразумеваю делать следующее:
- Поместите курсор на первую строку
- Начать запись макроса клавиатуры
- Изменить первую строку
- Поместите курсор на следующую строку
- Остановить запись.
Теперь все, что нужно для изменения следующей строки, это повторить макрос.
Я мог бы жить без поддержки регулярных выражений, но не мог жить без анонимных макросов клавиатуры.
Первое, что я делаю с любым редактором, это пытаюсь выяснить, какие это странности в Regex. Я пользуюсь этим все время. Ничего особо сумасшедшего, но это удобно, когда вам нужно копировать / вставлять вещи между различными типами текста - SQL <-> PHP - это тот, который я делаю чаще всего, - и вы не хотите пускаться в ход, делая одно и то же изменение 500 раз.