Регулярное выражение Elixir, соответствующее буквальному обратному слэшу

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

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.


person Arijoon    schedule 05.02.2020    source источник
comment
Что производит Regex.split(~r{\}, "C:\foo\bar")?   -  person MonkeyZeus    schedule 05.02.2020
comment
@MonkeyZeus, очевидно, ничего не производит, его нельзя проанализировать, потому что закрывающая скобка все еще находится внутри регулярного выражения, открывается с помощью ~r{ и никогда не закрывается (закрывающая фигурная черта экранируется обратной косой чертой.)   -  person Aleksei Matiushkin    schedule 05.02.2020
comment
Другой вариант (поскольку я предполагаю, что вы используете Windows) — это C:/foo/bar. Косая черта работает в Windows, но есть странные маленькие подводные камни, о которых нужно знать.   -  person Onorio Catenacci    schedule 06.02.2020


Ответы (1)


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

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

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

Обратите внимание на "\f" и "\b". Строка не содержит обратной косой черты, но содержит кодовые точки "\f" и "\b".

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

Regex.split(~r|\\|, "C:\\foo\\bar")
#⇒ ["C:", "foo", "bar"]
person Aleksei Matiushkin    schedule 05.02.2020