【问题标题】:Elixir regex matching literal backslashElixir 正则表达式匹配文字反斜杠
【发布时间】:2023-03-13 08:15:02
【问题描述】:

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

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

【问题讨论】:

  • Regex.split(~r{\}, "C:\foo\bar") 产生什么?
  • @MonkeyZeus 显然它不会产生任何东西,它不能被解析,因为右括号仍然在正则表达式中,用 ~r{ 打开并且从不关闭(结束卷曲用反斜杠转义。)
  • 另一个选项(因为我猜你使用的是 Windows)是“C:/foo/bar” 正斜杠在 Windows 上确实有效,但有一些奇怪的小问题需要注意。跨度>

标签: regex erlang elixir elixir-iex


【解决方案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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 2016-04-15
    • 2020-10-28
    • 2015-03-15
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多