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"]
令人惊讶的是,正则表达式匹配器无法正确匹配反斜杠。例如
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"]