Lua 模式设置中符号的重复次数

Amount of repetitions of symbols in Lua pattern setup

我正在寻找 Lua 模式设置中符号的重复次数。 我尝试检查字符串中的符号数量。 正如我在 manual 中所读到的, 即使使用字符 类 这仍然非常有限,因为我们只能匹配固定长度的字符串。

To solve this, patterns support these four repetition operators:

  • '*' Match the previous character (or class) zero or more times, as many times as possible.
  • '+' Match the previous character (or class) one or more times, as many times as possible.
  • '-' Match the previous character (or class) zero or more times, as few times as possible.
  • '?' Make the previous character (or class) optional.

所以,没有关于大括号的信息 {} 例如,

{1,10}; {1,}; {10};

无效。

local np = '1'
local a =  np:match('^[a-zA-Z0-9_]{1}$' )

returns np = nil.

local np = '1{1}'
local a =  np:match('^[a-zA-Z0-9_]{1}$' )

returns np = '1{1}' :)

这个url说没有这样的魔法符号:

Some characters, called magic characters, have special meanings when used in a pattern. The magic characters are

( ) . % + - * ? [ ^ $

花括号只能作为简单文本使用,仅此而已。 我对吗?避免这种情况的最佳方法是什么 'bug'?

可以阅读大括号的常用用法,例如here

我们不得不承认 Lua 正则表达式量词的功能非常有限。

  1. 它们就是您提到的那 4 个(+-*?
  2. 不支持限制量词(您需要的)
  3. 与其他一些系统不同,在 Lua 中修饰符只能应用于角色 class;无法在修饰符下对模式进行分组(请参阅 source). Unfortunately Lua patterns do not support this ('(foo)+' or '(foo|bar)'), only single characters can be repeated or chosen between, not sub-patterns or strings.

作为 "work-around",为了使用 限制量词 和所有其他 PCRE 正则表达式特权,您可以使用 rex_pcre library.

或者,正如@moteus 所建议的,部分解决方法 到 "emulate" 限制量词只有下限 ,只需重复模式以匹配它几次并应用可用的 Lua 量词到最后一个。例如。匹配 3 次或更多次 模式:

local np = 'abc_123'
local a = np:match('^[a-zA-Z0-9_][a-zA-Z0-9_][a-zA-Z0-9_]+$' )

IDEONE demo

另一个要考虑的库而不是 PCRE 是 Lpeg