【问题标题】:Erlang - Regex nomatch when it actually matchesErlang - 实际匹配时的正则表达式不匹配
【发布时间】:2018-06-21 16:56:26
【问题描述】:

我在从 url 中提取值时遇到了一些问题。

这是我测试过的正则表达式代码:https://regex101.com/r/rfRmhh/1

在那段代码中是反斜杠,我按照 Erlang 的说明再次反斜杠:

字符串的 Erlang 文字语法使用“\”(反斜杠) 字符作为转义码。您需要在文字中转义反斜杠 字符串,无论是在代码中还是在 shell 中,都带有一个额外的反斜杠, 那是, ”\”。 - http://erlang.org/doc/man/re.html

这是我的代码:

get_from_url()->
  Pattern = "/(.+)-([0-9_]+)x([0-9_]+)(-[0-9a-zA-Z(),\\-._]+)*\\.(jpg|jpeg|png|gif|JPG|JPEG|PNG|GIF)$/",
  Url = "http://localhost:8001/78326459041381-200x100.jpg",
  re:run(Url, Pattern).

它只返回“不匹配”。 (但正则表达式在测试站点上有效。)其次,即使我得到匹配,它也会返回类似{match,[{0,14},{0,13}]} 的内容。我假设这些是列表中匹配变量的偏移量?

然后会使用sublist(List1, Start, Len) 函数来获取值吗?

【问题讨论】:

    标签: regex erlang


    【解决方案1】:

    您不需要正则表达式模式中的前导或尾随/。它们在 Erlang 中被视为文字 /(与 PHP 和可能更多的语言不同),这就是匹配失败的原因。

    1> Pattern = "(.+)-([0-9_]+)x([0-9_]+)(-[0-9a-zA-Z(),\\-._]+)*\\.(jpg|jpeg|png|gif|JPG|JPEG|PNG|GIF)$".
    2> Url = "http://localhost:8001/78326459041381-200x100.jpg".
    3> re:run(Url, Pattern).
    {match,[{0,48},{0,36},{37,3},{41,3},{-1,0},{45,3}]}
    

    这将返回一个{match, List},其中List 是一个包含起始偏移量和匹配长度的元组列表。要将捕获的值作为字符串或二进制获取,可以使用capture 选项:

    4> re:run(Url, Pattern, [{capture, all, list}]).
    {match,["http://localhost:8001/78326459041381-200x100.jpg",
            "http://localhost:8001/78326459041381","200","100",[],
            "jpg"]}
    5> re:run(Url, Pattern, [{capture, all, binary}]).
    {match,[<<"http://localhost:8001/78326459041381-200x100.jpg">>,
            <<"http://localhost:8001/78326459041381">>,<<"200">>,
            <<"100">>,<<>>,<<"jpg">>]}
    

    【讨论】:

    • 谢谢Dogbert。你知道我的第二个问题该怎么办吗? (我现在如何获取值,或者 {match, [...]} 中的第二个列表到底是什么?)
    • 糟糕,错过了那部分。我已经在我的答案中添加了如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2017-12-20
    相关资源
    最近更新 更多