Elixir 正则表达式匹配文字反斜杠

Elixir regex matching literal backslash

令人惊讶的是,正则表达式匹配器无法正确匹配反斜杠。例如

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 路径。

正则表达式没问题;您的输入不是您认为的那样。字符串内的反斜杠 escapes.

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"]