【问题标题】:Using an escaped (magic) character as boundary in a character range in Lua patterns使用转义(魔术)字符作为 Lua 模式中字符范围的边界
【发布时间】:2019-04-13 12:58:37
【问题描述】:

第 6.4.1 节 Lua 模式状态中的 Lua manual

一个字符类用于表示一组字符。这 描述字符类时允许以下组合:

  • x:(其中x 不是^$()%.[]*+-? 的魔术字符之一)代表字符x 本身。
  • .:(一个点)代表所有字符。
  • %a:代表所有字母。
  • %c:代表所有控制字符。
  • %d:代表所有数字。
  • %g:表示除空格外的所有可打印字符。
  • %l:代表全小写。
  • %p:代表所有标点符号。
  • %s:代表所有空格字符。
  • %u:代表全大写。
  • %w:代表所有字母数字字符。
  • %x:代表所有十六进制数字。
  • %x:(其中 x 是任何非字母数字字符)表示字符 x。这是逃脱魔法角色的标准方法。 任何非字母数字字符(包括所有标点符号、 即使是非魔法)也可以在用于表示时以% 开头 本身在一个模式。
  • [set]:代表set中所有字符联合的类。可以通过分隔结尾来指定字符范围 范围内的字符,按升序排列,带有-。所有课程 上述%x 也可以用作集合中的组件。所有其他 set 中的字符代表他们自己。例如,[%w_](或 [_%w]) 表示所有字母数字字符加上下划线, [0-7] 代表八进制数字,[0-7%l%-] 代表 八进制数字加上小写字母加上- 字符。

您可以将右方括号放在集合中,方法是将其定位为 集合中的第一个字符。您可以在集合中放置一个连字符 将其定位为集合中的第一个或最后一个字符。 (你可以 在这两种情况下也使用转义符。)

范围和类之间的交互没有定义。因此,像 [%a-z] 或 [a-%%] 这样的模式没有意义。

[^set]:表示set的补集,这里set被解释 如上。

对于由单个字母(%a%c 等)表示的所有类, 对应的大写字母代表类的补码。 例如,%S 代表所有非空格字符。

字母、空格和其他字符组的定义取决于 当前语言环境。特别是,[a-z] 类可能不是 相当于%l
(我添加的突出显示和一些格式)

所以,由于“范围和类之间的交互没有定义。”,你如何创建一个字符类set,它以需要的(魔术)字符开头和/或结尾被逃脱?

例如,

[%%-c]

没有定义范围从%c 的字符类,并且包括介于两者之间的所有字符,而是仅包含三个字符%-c 的集合。

【问题讨论】:

  • 这个问题最近出现在一个已关闭并随后被删除的帖子中。但是,我认为这是一个值得记录的有趣问题。

标签: lua lua-patterns


【解决方案1】:

范围和类之间的交互没有定义。

显然,这不是一个硬性规定(一般的正则表达式字符集),而是一个 Lua 实现决定。虽然在字符集/范围中使用速记字符适用于某些(大多数)正则表达式风格,但它并非全部(如在 Python 的 re 模块中,demo)。

然而,第二个例子具有误导性:

因此,像 [%a-z] 或 [a-%%] 这样的模式没有意义。

虽然第一个示例很好,因为%aset 中的速记类(代表所有字母),但[%a-z] 未定义,如果与字符串匹配,将返回nil

[set] 中的转义范围字符

在第二个示例中,[a-%%]%% 仅定义了转义的 % 符号,而不是速记字符类。表面的问题是,范围是颠倒定义,从highlow(参考字符@987654333的US ASCII值@ 61% 37),例如像 [f-a] 这样的错误 Lua 模式。如果该集合以相反的顺序定义,则 seems to work: [%%-a] 但它所做的只是匹配三个单独的字符,而不是匹配 %a 之间的字符范围;信用cyclaminist)。

这可能被视为一个错误,实际上意味着如果需要转义定义范围字符之一,则无法在 [set] 中创建一系列字符。

可能的解决方案

从下一个不需要转义的字符开始字符范围 - 然后单独添加剩余的转义字符,例如

[%%&-a]

Sample:

for w in string.gmatch("%&*()-0Aa", "[%%&-a]") do
  print(w)
end

这是我找到的答案。不过,也许其他人有更好的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多