Как в Elixir разделить строку, если символы, не являющиеся словами, являются разделителями, но также можно использовать математические операторы, такие как +, -, et c.? - PullRequest
2 голосов
/ 12 июля 2020

В Elixir я хотел бы разделить строку, рассматривая все символы, не являющиеся словами, как разделители, включая «Огамовый пробел» () (который не следует путать со знаком минус (-)).

Итак, если я разделю строку:

"1\x002\x013\n4\r5 6\t7 + asda - 3434"

Результат должен быть:

["1","2","3","4","5","6","7","+","asda","-","3434"]

Я пытаюсь выяснить, как сделайте это с помощью Regex, но лучшее, что я смог выполнить sh, это:

Regex.split(~r/[\W| ]+/, input_string)

.... но это отбрасывает знак + и -, как они не считаются словесными символами.

или

Regex.split(~r/[^[:punct:]|^[:alnum:]| ]+/, input_string)

, но это не может быть разделено на пробел Огама.

Это действительно будет работать правильно, но неэлегантно для дополнительное преобразование:

Regex.split(~r/[^[:punct:]|^[:alnum:]]+/, String.replace(input_string, " ", " "))

Есть ли способ разделить это с помощью одного вызова Regex?

1 Ответ

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

Регулярные выражения Elixir обрабатываются механизмом регулярных выражений PCRE, и ваша входная строка содержит символы из всей таблицы символов Unicode, а не только части ASCII.

Вы можете включить режим Unicode с помощью двух PCRE глаголы, (*UTF)(*UCP):

Regex.split(~r/(*UTF)(*UCP)[^\w\/*+-]+/, "1\x002\x013\n4\r5 6\t7 + asda - 3434")

Будет выведено:

["1", "2", "3", "4", "5", "6", "7", "+", "asda", "-", "3434"]

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

ПРИМЕЧАНИЕ : ~r/[^\w\/*+-]+/u и ~r/(*UTF)(*UCP)[^\w\/*+-]+/ эквивалентны , u - это сокращение для двух глаголов PCRE.

Регулярное выражение соответствует

  • (*UTF)(*UCP) - (*UTF) обрабатывает входную строку как последовательность кодовых точек Юникода, а (*UCP) делает \w распознающим Юникод (так что соответствует [\p{L}\p{N}_] символам)
  • [^\w\/*+-]+ - 1 или больше символов, кроме букв, цифр, /, *, + и -.

Обратите внимание, что - в значении буквального - char не должны быть экранированы при размещении в конце класса символов.

...