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

9
我正在寻找在Lua模式设置中符号重复的数量。 我试图检查字符串中符号的数量。 根据手册所述, 即使有字符类,这仍然非常有限,因为我们只能匹配具有固定长度的字符串。
为解决这个问题,模式支持以下四种重复运算符:
* 匹配前一个字符(或类)零次或多次,尽可能多地匹配。 + 匹配前一个字符(或类)一次或多次,尽可能多地匹配。 - 匹配前一个字符(或类)零次或多次,尽可能少地匹配。 ? 使前一个字符(或类)可选。
因此,没有关于花括号{}的信息 例如,
{1,10}; {1,}; {10};

无法工作。

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

返回值为 np = nil

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

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

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

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

( ) . % + - * ? [ ^ $

花括号只能作为简单文本使用,不能起到其他作用。我是不是正确的?如何避免这个“bug”?

可以在这里查看花括号的常规用法,例如这里


2
Lua本身不提供此功能。您可以自己重复使用例如(\d{2,}%d%d+)。另外,您可以使用Lua rex pcre库。 - moteus
2
@trololo - 正则表达式从来都不是一件快速的事情。它总是需要大量的CPU资源。寻找其他计算更快的方法:#np==k and not np:find'[^%w_]' - Egor Skriptunoff
1
另一个支持的量词的限制是:与其他一些系统不同,在Lua中,修饰符只能应用于字符类;没有办法在修饰符下分组模式。尝试使用PCRE库:> require“rex_pcre”> return rex_pcre.new(“ ^ [a-zA-Z0-9_]{2} $”):exec(“12”) - Wiktor Stribiżew
@EgorSkriptunoff,我认为你是对的:在我的简单情况下,事先检查字符串长度是最可用的解决方案,而不使用外部库。 - Vyacheslav
@stribizhev,谢谢,我会尝试的。 - Vyacheslav
显示剩余3条评论
1个回答

7
我们不得不承认,Lua正则表达式量词在功能上非常有限。
  1. 它们只有你提到的那四个(+, -, *?)。
  2. 不支持限定量词(您需要的那些)。
  3. 与其他一些系统不同,在Lua中修饰符只能应用于字符类;没有办法将模式分组为一个修饰符下(参见源代码)。不幸的是,Lua模式不支持此功能('(foo)+''(foo|bar)'),只能重复或在单个字符之间选择,不能重复子模式或字符串。

作为“解决方法”,为了使用限制性量词和所有其他PCRE正则表达式优点,您可以使用rex_pcre

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

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

查看IDEONE演示

除PCRE外,还可以考虑使用Lpeg库。


1
感谢您对评论的总结。 - Vyacheslav
1
只是注意:[a-zA-Z0-9_] 可以被替换为 [_%w],这将大大缩短该模式。 - ryanpattison
你也可以使用 string.rep 函数,例如 if np:match(("x"):rep(50)) 来匹配 50 个 x 字符。 - jonasstr
@jonasstr 是的,我们需要使用一些现有的代码,而在我的回答中,我更关注于纯Lua模式可以做什么。那是7年前我对Lua了解得不够好的时候回答的。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接