代码之家  ›  专栏  ›  技术社区  ›  Yuri Ghensev

逻辑的还是逻辑的?

  •  9
  • Yuri Ghensev  · 技术社区  · 14 年前

    有可能在Lua实现吗?

    local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
    -- noSlashEnding should contain "slash\\ending\\string"
    
    local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
    -- noSlashEnding2 should contain "slash/ending/string"
    

    这里的要点是不接受lua模式中的逻辑“或”语句。


    编辑: 刚刚意识到这是可能的,通过这样做:

    strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")
    

    尽管模式的逻辑“或”仍然缺失。

    3 回复  |  直到 10 年前
        1
  •  7
  •   Community CDub    8 年前

    Lua不使用标准正则表达式进行模式匹配。书中的一句话 Programming in Lua 解释原因:

    与其他几种脚本语言不同,Lua不使用POSIX正则表达式(regexp)进行模式匹配。其主要原因是大小:posix regexp的典型实现需要4000多行代码。这比所有的Lua标准库加在一起都要大。相比之下,Lua中模式匹配的实现少于500行。当然,Lua中的模式匹配不能完成完整的POSIX实现所做的全部工作。然而,Lua中的模式匹配是一个强大的工具,它包含一些难以与标准POSIX实现匹配的特性。

    但是,现有的正则表达式库和高级的 LPeg 图书馆。有关带有链接的列表,请参见 http://lua-users.org/wiki/LibrariesAndBindings Text processing .

    另外,请参见以下问题: Lua pattern matching vs. regular expressions

        2
  •  5
  •   gwell    14 年前

    卢阿 pattern matching 与正则表达式不同,并且没有交替概念。

    例如,如果要删除 "abc" "efg" 从字符串的结尾(类似于 "(abc|efg)$" 正则表达式)以下代码可以很好地工作:

    local inputstring="123efgabc"
    local s,n = inputstring:gsub("abc$", "")
    if n == 0 then
      s,n = inputstring:gsub("efg$", "")
    end
    print(s) --> 123efg
    
        3
  •  0
  •   zwol    14 年前

    Lua正则表达式是…反常的从文档中我可以看出,不支持一般的交替,也不支持对组应用重复操作符。在您的例子中,正如您所说,您可以通过字符类获得您想要的内容(不过,我不确定逗号在您的字符类中做了什么)。

    请参见这里: http://www.lua.org/manual/5.1/manual.html#5.4.1

    (在我以前从事的一个项目中,因为这个原因,我们编写了自己的Lua绑定到PCRE。)