Замените строки как обычными, так и специальными символами с пробелом между ними - PullRequest
1 голос
/ 11 июля 2020

Я ищу, как обрабатывать строки, содержащие как обычные, так и специальные символы с пробелом между ними.

text = 'You got a Check +'

lookup_term = check +

replace_with_term = 'check+'

Конечный продукт, который я ищу, это you got a check+

В настоящее время я использую text.downcase.gsub(/\blookup_term\b/, replace_with_term) для обработки lookup_term с обычными символами, но я не могу выяснить, как обрабатывать комбинацию регулярного выражения + пробела + специального символа.

1 Ответ

1 голос
/ 11 июля 2020

Вы можете использовать

text.downcase.gsub(/(?<!\w)#{Regexp.escape(lookup_term)}(?!\w)/, replace_with_term)

Если вы действительно не хотите, чтобы строка переводилась в нижний регистр, а просто хотите сопоставление без учета регистра, используйте модификатор /i и удалите .downcase:

text.gsub(/(?<!\w)#{Regexp.escape(lookup_term)}(?!\w)/i, replace_with_term)

См. Онлайн-демонстрацию Ruby .

Результирующее регулярное выражение будет выглядеть как /(?<!\w)check\ \+(?!\w)/, см. Rubular demo .

Обратите внимание, что значение \b зависит от контекста, и соответствует пустому пространству (местоположению)

  1. Перед первым символом в строке, если первый символ является символом слова.
  2. После последнего символа в строке, если последний символ является символом слова.
  3. Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

Шаблон (?<!\w)check\ \+(?!\w) содержит однозначные границы слова , они всегда совпадают одинаково:

  • (?<!\w) - левая граница слова, требует начала позиции строки или любого не слова символ непосредственно слева от текущего местоположения
  • check\ \+ - check, пробел и +
  • (?!\w) - правая граница слова, требует конца строки позиция или любой другой символ, не являющийся словом, непосредственно справа от текущего местоположения.
...