问题标签 [lpeg]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - Lua 单词搜索
我将如何在 Lua 中进行多模式搜索?(我设置了 Lpeg)。
例如,假设我连续接收字符串,我一次处理一个,将它们捕获并调用它们msg
。现在我想获取msg
并检查它是否具有以下任何模式:MUFFIN MOOPHIN MUPHEN M0FF1N
首先。我如何检查是否msg
有任何这些(如果它不止一个则无关紧要)而不必写一个巨大的if(or or or or)
?
xml - 使用 LPeg re 模块解析 XML 类型的文件
我正在尝试学习 LPeg re module
,这是一次非常有趣的经历,特别是因为官方文档非常好。
但是,有些主题似乎在那里没有得到很好的解释。例如named group capture
构造:{:name: p :}
.
考虑以下示例,我不明白为什么它不匹配:
谁能帮我理解这里出了什么问题?我想了很多,我真的好像错过了一些重要的东西。
lua - 以 LPeg 模式更改捕获的返回顺序?
(我正在使用 Lua 5.2 和 LPeg 0.12)
假设我有一个模式P
可以产生一些不确定数量的捕获(如果有的话),并且我想编写一个模式Q
来捕获P
以及之后的P
位置 -- 但要在. 本质上,如果结果为,那么我想要结果为。P
lpeg.match(P * lpeg.Cp(), str, i)
v1, v2, ..., j
lpeg.match(Q, str, i)
j, v1, v2, ...
P
这是否可以在每次匹配时都不必创建新表来实现?
大多数情况下,我想这样做是为了简化一些产生迭代器的函数。Lua 的无状态迭代器函数只获取一个控制变量,它需要是迭代器函数返回的第一个值。
在一个允许人们命名可变参数函数的最后一个参数的世界中,我可以这样写:
唉。简单的解决方案是明智地使用lpeg.Ct()
:
或让来电者进行lpeg.match
打包/删除/插入/解包舞蹈。尽管后者听起来很恶心,但我可能会这样做,因为lpeg.Ct()
可能会对pos_then_captures
.
每次pattern
成功匹配时,其中任何一个都会创建一个新表,诚然这在我的应用程序中并不重要,但是有没有办法在没有任何打包解包魔法的情况下做到这一点?
我对 Lua 的内部不太熟悉,但感觉我真正想做的是从 Lua 的堆栈中弹出一些东西并将其放回其他地方,这似乎不是一个直接或有效的操作支持,但也许 LPeg 在这种特定情况下可以做的事情。
lua - 在 LPeg 中匹配具有特定结尾的字符串
我正在尝试用 a 和 b 的组合捕获一个字符串,但总是以 b 结尾。换句话说:
匹配aaab
andbbabb
但不匹配aaa
or bba
。但是,以上内容不匹配任何内容。这是因为S'ab'^0
贪心而匹配决赛b
吗?lpeg.Cmt
我是这么认为的,除了求助于这似乎有点矫枉过正之外,我想不出任何替代方案。但也许不是,有人知道如何匹配这样的模式吗?我看到了这个问题,但是解决方案的问题在于它会停在第一个结束标记处(即那里的“猫”,这里的“b”),就我而言,我需要接受中间的“b”。
PS我实际上想要做的是匹配一个最外层规则是函数调用的表达式。例如
全部匹配,但
不要。我的语法的其余部分有效,我很确定这归结为同一个问题,但为了完整起见,我正在使用的语法看起来像:
同样地,我最终会V'postfix_op'^0
吃掉func_call_op
我所期待的东西。
lua - 我可以创建一个返回可变数量值的 gmatch 模式吗?
我需要在我正在编写的程序中迭代一些字符串对。我没有将字符串对放在一个大表中,而是将它们全部放在一个字符串中,因为我认为最终结果更容易阅读:
输出是您所期望的:
但是,顾名思义,该two_column_data
函数仅在正好有两列数据时才有效。我怎样才能使它适用于任意数量的列?
如果有必要,我可以使用 lpeg 来完成这项任务。
lua - LPeg.re (Lua) 中不区分大小写的匹配
我是 Lua 的“LPeg”和“re”模块的新手,目前我想根据以下规则编写一个模式:
- 匹配以“gv_$/gv$/v$/v_$/x$/xv$/dba_/all_/cdb_”开头的字符串和前缀“SYS.%s*”或“PUBLIC.%s*”是可选的
- 字符串不应跟随字母数字,即模式与“XSYS.DBA_OBJECTS”不匹配,因为它跟随“X”
- 该模式不区分大小写
例如,以下字符串应与模式匹配:
目前我的模式低于只能匹配大写的非字母数字+字符串:
我的问题是:
- 如何实现不区分大小写的匹配?有一些关于解决方案的主题,但我太新了,无法理解
- 如何只返回匹配的字符串,而不是还必须加上 %W?Java中的“(?= ...)”之类的东西
如果您能提供模式或相关功能,我们将不胜感激。
lua - Lpeg“规则中的空循环”错误
谁能提供一个清楚的解释和一些简单的例子来显示这个错误,显然与匹配时间捕获(Cmt)有关?
我不明白我能找到的唯一提及,即
http://lua-users.org/lists/lua-l/2013-06/msg00086.html
谢谢
error-handling - 如何使用 LPeg 发出解析错误信号?
我正在编写一个基于 LPeg 的解析器。我怎样才能使它返回解析错误nil, errmsg
?
我知道我可以使用error()
,但据我所知,这会产生正常错误,而不是nil, errmsg
.
代码很长,但相关部分是这样的:
当出现无效逃逸时,我想Line:match(...)
返回。nil, errmsg
parsing - 使用 lpeg 仅捕获单词边界
我一直在开发一个使用 LPEG 实现语法高亮支持的文本编辑器。启动和运行非常简单,但我只完成了最低要求。
我已经定义了一堆这样的模式:
这可以正确处理输入,但不幸的是匹配太多。例如int
,在 中间匹配printf
,这是预期的,因为我使用 " P
" 进行文字匹配。
显然,要执行“正确”突出显示,我需要匹配单词边界,例如“int”匹配“int”,但不匹配“printf”、“vsprintf”等。
我试图用它来限制匹配只发生在“ <[{ \n
”之后,但这并没有达到我想要的效果:
我在这里缺少一个简单、明显的解决方案来仅匹配由空格或您在 C 代码中期望的其他字符包围的关键字/标记吗?我确实需要捕获的令牌,以便我可以突出显示它,但除此之外,我不会接受任何特定的方法。
例如,这些应该匹配:
但这不应该:
unicode - 使用 LPeg 匹配 Unicode 标点符号
我正在尝试创建一个与 UTF-8 编码输入中的任何 Unicode 标点符号匹配的 LPeg 模式。我想出了以下 Selene Unicode 和 LPeg 的结合:
这似乎有效,但它会错过由几个 Unicode 代码点组合而成的标点符号(如果存在这样的字符),因为我只提前读取 4 个字节,它可能会降低解析器的性能,并且它是未定义的库match
函数会做,当我给它一个包含矮小的 UTF-8 字符的字符串时(尽管它现在似乎可以工作)。
我想知道这是否是一种正确的方法,或者是否有更好的方法来实现我想要实现的目标。