2016-07-08 21 views
0

Я имею дело с кучей текстовых файлов, которые относятся к именам файлов изображений. Эти имена файлов были дезинфицированы (сделанные в нижнем регистре и пробелы заменены дефисами), но текст, относящийся к ним, не был.Regex: соответствие всех вхождений между указанными строками

Мне нужно преобразовать строки так:

(image: uploaded IMAGE.jpg caption: this is my caption) 
(image: uploaded IMAGE copy.jpeg caption: this is my caption) 
(image: IMG_6087.png caption: this is my caption) 
(image: IMG_6087 copy.gif) 
(image: IMG_9999_copy.jpg) 
(image: somehow, a comma.jpg) 
(image: other ridic'ulous characters!.jpg) 

к:

(image: uploaded-image.jpg caption: this is my caption) 
(image: uploaded-image-copy.jpeg caption: this is my caption) 
(image: img_6087.png caption: this is my caption) 
(image: img_6087-copy.gif) 
(image: img_9999_copy.jpg) 
(image: somehow-a-comma.jpg) 
(image: other-ridiculous-characters.jpg) 

Эти строки являются частями больших блоков текста, но все на своих линиях, например, так:

This is not a short guide to write about art. Go in, out of the window, inside New York’s stars qualities, dreams and schemes. People are gathered together, brewing coffee — you have seen their faces? The artists in Manhattan. 

(image: manhattan photo.jpg) 

Drive till sunset and say goodbye to your body, because this is not a photograph. I saw sixteen americans, raised by wolves, probably lost in paradise city. I found your head — Do you still want it? 

Я использую Возвышенный текст и планировал выполнять несколько Заменить все:

  1. полоса пробельные
  2. полосы символов, которые не являются буквенно-цифровой или _ или -
  3. сделать строчными

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

(?<=^\(image:)[what do I do here??](?=\.jpe?g|png|gif)

ответ

0

вы можете использовать нежадным матч все .*?

так ^\(image: (.*?\.(:?jpe?g|png|gif)), чтобы захватить имя файла с расширением

+0

Это захватывает все имя файла, поэтому я могу сделать его строчным, используя поиск: '(? <=^\ (Image:) (. *?) (? = \. Jpe? G | png | gif) 'replace:' \ L $ 1' - так, что решает шаг № 3 - но как найти и заменить все пробелы дефисом? –

-1

Вы можете попробовать JetBrains webstrom передний конец IDE. Это обеспечивает множество возможностей для выполнения любых операций регулярного выражения с возможностью чтения. Выберите текст, который вы хотите разделить, проверьте флаги или любые пробелы.

Вы получите его в течение 30 дней. Также вскоре вы получите запрос на регулярное выражение.

Также проверка http://myregexp.com/ или какой-либо плагин для действительного Вашего регулярного выражения запросов

Online Regex editor

0

Вы можете получить имена файлов с:

(?<=image:\s)([^.]++)(?=\.jpe?g|\.png|\.gif) 

После этого преобразования зависят от языка, который вы» повторите работу. Добавьте расширения файлов по мере необходимости. Прямо сейчас вы поддерживаете jpg, jpeg, png и gif.

0

Вот рабочий способ сделать это в PHP

<?php 
$string = 
"This is not a short guide to write about art. Go in, out of the window, inside New York’s stars qualities, dreams and schemes. People are gathered together, brewing coffee — you have seen their faces? The artists in Manhattan. 

(image: uploaded IMAGE.jpg caption: this is my caption) 
This is not a short guide to write about art. Go in, out of the window, inside New York’s stars qualities, dreams and schemes. People are gathered together, brewing coffee — you have seen their faces? The artists in Manhattan. 

(image: uploaded IMAGE copy.jpeg caption: this is my caption) 
(image: IMG_6087.png caption: this is my caption) 
(image: IMG_6087 copy.gif) blah blah 
(image: IMG_9999_copy.jpg) 
(image: somehow, a comma.jpg) 
(image: other ridic'ulous characters!.jpg)"; 

echo preg_replace_callback('~(?<=\(image:)(.*?)\.(jpg|jpeg|png|gif)~', function($matches) 
{ 
    return preg_replace('~\W~', '-', stripslashes(strtolower($matches[1]))) . ".$matches[2]"; 
}, $string); 

?> 

[EDIT] добавить регулярное выражение объяснение:

  • (?<=image:): положительный просмотра назад - поэтому проверка наличия 'изображения:' но не захватывает.
  • (.*?): захватывает все перед расширением изображения жадным способом - так что вы можете как можно меньше текста.
  • \.(jpg|jpeg|png|gif): будет соответствовать . буквально + одному из указанных расширений - и удержит расширение для повторного использования.
  • ~: является разделителем, этот выбор только потому, что он очень редко используется в строках и не нужно \/
  • \W: это противоположность \w и он будет соответствовать любой не алфавитно-цифровой символ.

Выведет (в источнике зрения):

This is not a short guide to write about art. Go in, out of the window, inside New York’s stars qualities, dreams and schemes. People are gathered together, brewing coffee — you have seen their faces? The artists in Manhattan. 

(image: uploaded-image.jpg caption: this is my caption) 
This is not a short guide to write about art. Go in, out of the window, inside New York’s stars qualities, dreams and schemes. People are gathered together, brewing coffee — you have seen their faces? The artists in Manhattan. 

(image: uploaded-image-copy.jpeg caption: this is my caption) 
(image: img_6087.png caption: this is my caption) 
(image: img_6087-copy.gif) blah blah 
(image: img_9999_copy.jpg) 
(image: somehow--a-comma.jpg) 
(image: other-ridic-ulous-characters-.jpg) 

Вы можете затем подстроить в обратный вызов, какой символ вы хотите превратить в то, что, с str_replace(), например.

надеюсь, что это поможет! ;)

Смежные вопросы