Эликсир регулярных выражений, соответствующих буквальному наклонному - PullRequest
1 голос
/ 05 февраля 2020

Удивительно, но сопоставитель регулярных выражений не соответствует бэксле sh правильно. Например,

Regex.split(~r{\\}, "C:\foo\bar")
["C:\foo\bar"]
Regex.match?(~r/\\/, "C:\foo\bar")
false

Я бы ожидал положительного совпадения, но, возможно, я ошибаюсь в \. Давайте проверим это:

Regex.escape("\\")
"\\\\"
Regex.split(~r{\\\\}, "C:\foo\bar")
["C:\foo\bar"]
Regex.match?(~r/\\\\/, "C:\foo\bar")
false

Все еще не соответствует. Довольно запутался в этой точке. Как вы избегаете \ в регулярном выражении, чтобы соответствовать буквальному \, как вы можете видеть в моем сценарии использования, я хотел бы разбить путь windows.

1 Ответ

3 голосов
/ 05 февраля 2020

регулярное выражение в порядке; ваш вклад не то, что вы думаете. Backsla sh внутри строк экранирует .

String.split("C:\foo\bar", "")
#⇒ ["", "C", ":", "\f", "o", "o", "\b", "a", "r", ""]

String.length("C:\foo\bar")
#⇒ 8

Примечание "\f" и "\b" там. Строка не содержит backsla sh, но содержит кодовые точки "\f" и "\b".

При этом вам нужно передать правильную строку в Regex.split/3, чтобы получить ожидаемый результат.

Regex.split(~r|\\|, "C:\\foo\\bar")
#⇒ ["C:", "foo", "bar"]
...