Использование регулярных выражений для замены всех пробелов НЕ в кавычках в Ruby - PullRequest
4 голосов
/ 15 октября 2008

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

a = 4, b = 2, c = "space here"

вернет это:

a=4,b=2,c="space here"

Я потратил некоторое время на поиск по этому сайту и обнаружил похожий q / a ( Разделить строку пробелами - сохраняя подстроки в кавычках - в Python ), который заменит все пробелы внутри кавычек токен, который можно заменить после очистки всех остальных пробелов ... но я надеялся, что есть более чистый способ сделать это.

Ответы [ 4 ]

8 голосов
/ 17 октября 2008

Стоит отметить, что любое решение с регулярным выражением завершится неудачей в случаях, подобных следующему:

a = 4, b = 2, c = "space" here"

Хотя это правда, что вы можете создать регулярное выражение для обработки случая с тремя кавычками, вы не можете решить проблему в общем смысле. Это математически обоснованное ограничение простых DFA , регулярные выражения которых являются прямым представлением. Чтобы выполнить любое серьезное сопоставление скобок / кавычек, вам понадобится более мощный pushdown автомат , обычно в форме библиотеки текстового анализатора (ANTLR, Bison, Parsec).

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

4 голосов
/ 15 октября 2008

Это похоже на работу:

result = string.gsub(/( |(".*?"))/, "\\2")
2 голосов
/ 15 октября 2008

Я считаю это очень чистым:

mystring.scan(/((".*?")|([^ ]))/).map { |x| x[0] }.join

Я сомневаюсь, что gsub мог бы быть лучше (при условии, что вы хотите использовать метод регулярных выражений).

0 голосов
/ 17 октября 2008

попробуйте это, строка в одинарных / двойных кавычках также соответствует (поэтому вам нужно отфильтровать их, если вам нужно только пробел):

/( |("([^"\\]|\\.)*")|('([^'\\]|\\.)*'))/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...