Проблема с Ruby Regex text.gsub [^ \ W-], '') не работает - PullRequest
6 голосов
/ 26 сентября 2008

Я пытаюсь выучить Regex на Ruby, основываясь на том, что я читаю в "The Rails Way". Но даже этот простой пример ставит меня в тупик. Я не могу сказать, если это опечатка или нет ...

text.gsub (/ \ s /, "-"). Gsub ([^ \ W-], '') .downcase

Мне кажется, что это заменит все пробелы на -, а затем, если строка начинается с буквы или цифры, за которой следует тире, замените ее на ''. Но, используя irb, сначала происходит сбой в ^ «синтаксическая ошибка, неожиданное« ^ », ожидается«] »», и если я вынимаю ^, то снова происходит сбой в W.

Я здесь очень запутался.

Ответы [ 5 ]

9 голосов
/ 26 сентября 2008
>> text = "I love spaces"
=> "I love spaces"
>> text.gsub(/\s/, "-").gsub(/[^\W-]/, '').downcase
=> "--"

Отсутствует //

Хотя в этом есть немного больше смысла: -)

>> text.gsub(/\s/, "-").gsub(/([^\W-])/, '\1').downcase
=> "i-love-spaces"

И это, вероятно, то, что имеется в виду

>> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase
=> "i-love-spaces"

\ W означает "не слово" \ w означает "слово"

// генерируем объект регулярного выражения

/ [^ \ W -]. / Класс => Регулярное выражение

3 голосов
/ 27 сентября 2008

Шаг 1: Добавьте это в закладки . Всякий раз, когда мне нужно посмотреть регулярные выражения, это моя первая остановка

Шаг 2: Давайте пройдемся по вашему коду

text.gsub(/\s/, "-")

Вы вызываете функцию gsub и задаете ей 2 параметра.
Первый параметр - /\s/, который является ruby ​​для «создания нового регулярного выражения, содержащего \s (// являются специальными« »для регулярных выражений).
Вторым параметром является строка "-".

Таким образом, все пробельные символы будут заменены дефисами. Пока все хорошо.

.gsub([^\W-], '').downcase

Затем вы снова вызываете gsub, передавая ему 2 параметра. Первый параметр - [^\W-]. Поскольку мы не заключили его в кавычки, ruby ​​буквально попытается запустить этот код. [] создает массив, затем пытается вставить ^\W- в массив, который не является допустимым кодом, поэтому он ломается.
Изменение его на /[^\W-]/ дает нам действительное регулярное выражение.

Глядя на регулярное выражение, [] говорит «соответствует любому персонажу в этой группе. Группа содержит \W (что означает несловесный символ) и -, поэтому регулярное выражение должно соответствовать любому несловесному символу или любому дефису.

Поскольку вторая вещь, которую вы передаете gsub - это пустая строка, она должна заменить все несловарные символы и дефисы на пустую строку (таким образом, удаляя их)

.downcase

Что просто преобразует строку в нижний регистр.

Надеюсь, это поможет :-)

2 голосов
/ 26 сентября 2008

Ну, .gsub (/ [^ \ W -] /, '') говорит, что замените все, что не является ни словом, ни - даром.

Вы, вероятно, хотите

>> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase
=> "i-love-spaces"

Нижний регистр \ w (\ W как раз наоборот)

2 голосов
/ 26 сентября 2008

Вы забыли косые черты. Это должно быть /[^\W-]/

1 голос
/ 26 сентября 2008

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

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