Удалить не алфавитно-цифровые символы из строк с сохранением акцентированных символов - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно удалить символы, такие как "+", "/", "_" и подобные из строк, чтобы выполнить метод поиска.

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

string.gsub(/[^0-9A-Za-z]/, '')

РЕДАКТИРОВАТЬ: Языки, которые мне нужно поддерживать, испанский и каталонский.

Есть ли способ адаптировать выражение, чтобы сохранить буквы с акцентами?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы также можете использовать POSIX bracket expression.Вы найдете всю необходимую документацию в ruby-docs.

В вашем случае вы можете использовать:

string.gsub(/[^[:alpha:]]/, '')

или:

string.gsub(/[^[:alnum:]]/, '')

Из документации:

/ [[: alnum:]] / - Буквенный и цифровой символ

/ [[: alpha:]] / - Буквенный символ

0 голосов
/ 28 мая 2018

Оба ответа, приведенные здесь, пока совершенно неверны.

В современном юникоде есть два типа акцентов: составные и комбинированные диакритические знаки (разложенные). В Ruby 2.3+ все просто:

"Barça".unicode_normalize(:nfc).scan(/\p{L}/)
#⇒ ["B", "a", "r", "ç", "a"]

Вышеописанное будет работать независимо от того, как был построен символ «ç», как скомпонованный латинский символ или как объединенный диакритический знак.

При этом удаляются все не буквыможно было бы сделать:

"Barça".unicode_normalize(:nfc).gsub(/[^\p{L}]/, '')

До Ruby 2.3 не было стандартного способа нормализации строки в составную форму, и хотя для «mañana» простой диапазон À..ÿ работал бы (составная форма) для«Mañana» это не будет (объединенные диакритические знаки). Вы можете убедиться, что есть разница сами, скопировав оба в вашу оболочку irb.

0 голосов
/ 28 мая 2018

Заимствуя из ответов на этот вопрос , диапазон символов регулярных выражений для многих, но не для всех акцентированных символов составляет À-ÿ.Поэтому, чтобы соответствовать им, вы можете просто добавить это к вашим существующим диапазонам:

string.gsub(/[^0-9A-Za-zÀ-ÿ]/, '')

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

puts "I went to a café.".gsub(/[^0-9A-Za-zÀ-ÿ]/, '') # Iwenttoacafé
puts "Ahoj, světe!".gsub(/[^0-9A-Za-zÀ-ÿ]/, '')      # Ahojsvte

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

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