首页 > 解决方案 > 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 路径。

标签: regexerlangelixirelixir-iex

解决方案


正则表达式很好;你的输入不是你想的那样。字符串中的反斜杠转义

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

推荐阅读