【问题标题】:Lua pattern parentheses and 0 or 1 occurrenceLua 模式括号和 0 或 1 次出现
【发布时间】:2023-03-14 16:42:01
【问题描述】:

我正在尝试将字符串与模式进行匹配,但有一件事我还没有弄清楚。在正则表达式中我会这样做:

Strings:
en
eng
engl
engli
englis
english

Pattern:
^en(g(l(i(s(h?)?)?)?)?)?$

我希望所有字符串都匹配。 在 Lua 模式匹配中,我无法让它工作。

即使是这样一个更简单的例子也行不通:

Strings:
fly
flying

Pattern:
^fly(ing)?$

有人知道怎么做吗?

【问题讨论】:

    标签: regex lua lua-patterns


    【解决方案1】:

    您不能使用 Lua 的量词 ?*+- 使匹配组成为可选(或重复)。

    (%d+)? 模式中,问号“失去”了它的特殊含义,将简单地匹配文字?,正如您通过执行以下代码行所看到的:

    text = "a?"
    first_match = text:match("((%w+)?)")
    print(first_match)
    

    将打印:

    a?
    

    AFAIK,你可以在 Lua 中最接近的是使用该模式:

    ^eng?l?i?s?h?$
    

    (当然)也匹配"enh""enls"、...等字符串。

    【讨论】:

    • 遗憾的是,这有点失去意义,因为:enlh 并不真正适合。我将不得不通过捕获单词(%a*) 的其余部分来解决这个问题,然后检查它是否是允许的“后缀”。无论如何谢谢 :) 我已经预料到了,但是感谢您确认并说它与文字 ? 匹配
    【解决方案2】:

    在 Lua 中,括号仅用于捕获。它们不会产生原子。

    你可以得到最接近你想要的模式是:

    '^flyi?n?g?$'
    '^en?g?l?i?s?h?$'
    

    如果您需要正则表达式引擎的全部功能,可以使用 Lua 常用引擎的绑定。还有 LPeg,一个用于创建 PEGs 的库,它带有一个正则表达式引擎作为示例(不知道它有多强大)。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2015-11-14
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多