Lua模式设置中符号的重复量

Vya*_*lav 5 lua lua-patterns

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

为了解决这个问题,模式支持这四个重复运算符:

  • '*'尽可能多地匹配前一个字符(或类)零次或多次.
  • '+'尽可能多次匹配前一个字符(或类)一次或多次.
  • ' - '将前一个字符(或类)与零或多次匹配,尽可能少.
  • '?' 使前一个字符(或类)可选.

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

{1,10}; {1,}; {10};
Run Code Online (Sandbox Code Playgroud)

不起作用.

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

回报np = nil.

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

返回np = '1{1}':)

这个网址说没有这样的魔术符号:

某些字符(称为魔术字符)在模式中使用时具有特殊含义.神奇的人物是

( ) . % + - * ? [ ^ $
Run Code Online (Sandbox Code Playgroud)

卷曲括号仅作为简单文本工作,不再有效.我对吗?避免这个'错误'的最佳方法是什么?

例如,这里可以阅读大括号的常用用法.

Wik*_*żew 5

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

  1. 他们只是你提到的那 4 个 ( +, -,*?)
  2. 没有限制量词支持(您需要的)
  3. 与其他一些系统不同,在 Lua 中修饰符只能应用于字符类;无法在修饰符下对模式进行分组(请参阅源代码)。不幸的是 Lua 模式不支持这个('(foo)+''(foo|bar)'),只能重复或选择单个字符,而不是子模式或字符串。

作为“变通方法”,为了使用限制量词和所有其他 PCRE 正则表达式特权,您可以使用rex_pcrelibrary

或者,正如@moteus 建议的那样,“模拟”只有下界的限制量词的部分解决方法,只需重复模式以匹配它几次并将可用的 Lua 量词应用于最后一个。例如,匹配3 次或更多出现的模式:

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

IDEONE 演示

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