регулярное выражение для сопоставления непробельного пространства или пространства с префиксом '\\' - PullRequest
3 голосов
/ 24 ноября 2008

У меня есть список имен файлов, разделенных пробелами, где пробелы в именах файлов начинаются с префикса '\'

например. "первый \ файл второй \ файл"

Как я могу заставить свое регулярное выражение соответствовать каждому имени файла?

Ответы [ 3 ]

14 голосов
/ 24 ноября 2008
(\\ |[^ ])+

Все, кроме пробелов, кроме случаев, когда они сбежали. Должно работать, извините за неправильное понимание вашего вопроса изначально.

5 голосов
/ 24 ноября 2008
(\S|(?<=\\) )+

Объяснение:

Вы ищете символы, не являющиеся пробелами (\S), или пробел, начинающийся с обратной косой черты, несколько раз.

Все совпадения будут сохранены в группе Маха 1. Примените шаблон глобально, чтобы получить все совпадения в строке.

EDIT

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

(?:\S|(?<=\\) )+
1 голос
/ 24 ноября 2008

Я бы сделал это так:

/[^ \\]*(?:\\ [^\\ ]*)*/

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

Редактировать: (Томалак) Я поставил косые черты вокруг регулярного выражения, потому что подсветка синтаксиса, кажется, распознает их и рисует все регулярное выражение одним цветом. Без них он может подобрать другие символы, такие как кавычки, и неправильно (и запутанно) раскрасить части регулярного выражения в разные цвета.

(Брэд) В ОП упоминались только пробелы, поэтому я позволил им только цитировать их, но вы правы. Оригинальный пример развернутого цикла в книге был для строк в двойных кавычках, которые могут содержать любую из нескольких escape-последовательностей, одна из которых - экранированная кавычка. Вот регулярное выражение:

/"[^\\"]*(?:\\.[^\\"]*)*"/

(Томалак) Я не знаю, что вы имеете в виду, когда говорите, что оно не соответствует «имени файла в начале строки». Похоже, что совпадают оба имени файла в примере OP. Тем не менее, он также соответствует пустой строке, что не очень хорошо. Это можно исправить, но если эффективность не окажется проблемой, усилия не стоят. Решение Стефана работает отлично.

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