问题标签 [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.

0 投票
2 回答
416 浏览

arrays - Lua 单词搜索

我将如何在 Lua 中进行多模式搜索?(我设置了 Lpeg)。

例如,假设我连续接收字符串,我一次处理一个,将它们捕获并调用它们msg。现在我想获取msg并检查它是否具有以下任何模式:MUFFIN MOOPHIN MUPHEN M0FF1N首先。我如何检查是否msg有任何这些(如果它不止一个则无关紧要)而不必写一个巨大的if(or or or or)

0 投票
1 回答
191 浏览

xml - 使用 LPeg re 模块解析 XML 类型的文件

我正在尝试学习 LPeg re module,这是一次非常有趣的经历,特别是因为官方文档非常好。

但是,有些主题似乎在那里没有得到很好的解释。例如named group capture构造:{:name: p :}.

考虑以下示例,我不明白为什么它不匹配:

谁能帮我理解这里出了什么问题?我想了很多,我真的好像错过了一些重要的东西。

0 投票
2 回答
127 浏览

lua - 以 LPeg 模式更改捕获的返回顺序?

(我正在使用 Lua 5.2 和 LPeg 0.12)

假设我有一个模式P可以产生一些不确定数量的捕获(如果有的话),并且我想编写一个模式Q来捕获P以及之后P位置 -- 但要在. 本质上,如果结果为,那么我想要结果为。Plpeg.match(P * lpeg.Cp(), str, i)v1, v2, ..., jlpeg.match(Q, str, i)j, v1, v2, ...

P这是否可以在每次匹配时都不必创建新表来实现?

大多数情况下,我想这样做是为了简化一些产生迭代器的函数。Lua 的无状态迭代器函数只获取一个控制变量,它需要是迭代器函数返回的第一个值。

在一个允许人们命名可变参数函数的最后一个参数的世界中,我可以这样写:

唉。简单的解决方案是明智地使用lpeg.Ct()

或让来电者进行lpeg.match打包/删除/插入/解包舞蹈。尽管后者听起来很恶心,但我可能会这样做,因为lpeg.Ct()可能会对pos_then_captures.

每次pattern成功匹配时,其中任何一个都会创建一个新表,诚然这在我的应用程序中并不重要,但是有没有办法在没有任何打包解包魔法的情况下做到这一点?

我对 Lua 的内部不太熟悉,但感觉我真正想做的是从 Lua 的堆栈中弹出一些东西并将其放回其他地方,这似乎不是一个直接或有效的操作支持,但也许 LPeg 在这种特定情况下可以做的事情。

0 投票
3 回答
290 浏览

lua - 在 LPeg 中匹配具有特定结尾的字符串

我正在尝试用 a 和 b 的组合捕获一个字符串,但总是以 b 结尾。换句话说:

匹配aaabandbbabb但不匹配aaaor bba。但是,以上内容不匹配任何内容。这是因为S'ab'^0贪心而匹配决赛b吗?lpeg.Cmt我是这么认为的,除了求助于这似乎有点矫枉过正之外,我想不出任何替代方案。但也许不是,有人知道如何匹配这样的模式吗?我看到了这个问题,但是解决方案的问题在于它会停在第一个结束标记处(即那里的“猫”,这里的“b”),就我而言,我需要接受中间的“b”。

PS我实际上想要做的是匹配一个最外层规则是函数调用的表达式。例如

全部匹配,但

不要。我的语法的其余部分有效,我很确定这归结为同一个问题,但为了完整起见,我正在使用的语法看起来像:

同样地,我最终会V'postfix_op'^0吃掉func_call_op我所期待的东西。

0 投票
4 回答
155 浏览

lua - 我可以创建一个返回可变数量值的 gmatch 模式吗?

我需要在我正在编写的程序中迭代一些字符串对。我没有将字符串对放在一个大表中,而是将它们全部放在一个字符串中,因为我认为最终结果更容易阅读:

输出是您所期望的:

但是,顾名思义,该two_column_data函数仅在正好有两列数据时才有效。我怎样才能使它适用于任意数量的列?

如果有必要,我可以使用 lpeg 来完成这项任务。

0 投票
2 回答
457 浏览

lua - LPeg.re (Lua) 中不区分大小写的匹配

我是 Lua 的“LPeg”和“re”模块的新手,目前我想根据以下规则编写一个模式:

  1. 匹配以“gv_$/gv$/v$/v_$/x$/xv$/dba_/all_/cdb_”开头的字符串和前缀“SYS.%s*”或“PUBLIC.%s*”是可选的
  2. 字符串不应跟随字母数字,即模式与“XSYS.DBA_OBJECTS”不匹配,因为它跟随“X”
  3. 该模式不区分大小写

例如,以下字符串应与模式匹配:

目前我的模式低于只能匹配大写的非字母数字+字符串:

我的问题是:

  1. 如何实现不区分大小写的匹配?有一些关于解决方案的主题,但我太新了,无法理解
  2. 如何只返回匹配的字符串,而不是还必须加上 %W?Java中的“(?= ...)”之类的东西

如果您能提供模式或相关功能,我们将不胜感激。

0 投票
1 回答
411 浏览

lua - Lpeg“规则中的空循环”错误

谁能提供一个清楚的解释和一些简单的例子来显示这个错误,显然与匹配时间捕获(Cmt)有关?

我不明白我能找到的唯一提及,即

http://lua-users.org/lists/lua-l/2013-06/msg00086.html

谢谢

0 投票
1 回答
396 浏览

error-handling - 如何使用 LPeg 发出解析错误信号?

我正在编写一个基于 LPeg 的解析器。我怎样才能使它返回解析错误nil, errmsg

我知道我可以使用error(),但据我所知,这会产生正常错误,而不是nil, errmsg.

代码很长,但相关部分是这样的:

当出现无效逃逸时,我想Line:match(...)返回。nil, errmsg

0 投票
2 回答
237 浏览

parsing - 使用 lpeg 仅捕获单词边界

我一直在开发一个使用 LPEG 实现语法高亮支持的文本编辑器。启动和运行非常简单,但我只完成了最低要求。

我已经定义了一堆这样的模式:

这可以正确处理输入,但不幸的是匹配太多。例如int,在 中间匹配printf,这是预期的,因为我使用 " P" 进行文字匹配。

显然,要执行“正确”突出显示,我需要匹配单词边界,例如“int”匹配“int”,但不匹配“printf”、“vsprintf”等。

我试图用它来限制匹配只发生在“ <[{ \n”之后,但这并没有达到我想要的效果:

我在这里缺少一个简单、明显的解决方案来仅匹配由空格或您在 C 代码中期望的其他字符包围的关键字/标记吗?我确实需要捕获的令牌,以便我可以突出显示它,但除此之外,我不会接受任何特定的方法。

例如,这些应该匹配:

但这不应该:

0 投票
1 回答
277 浏览

unicode - 使用 LPeg 匹配 Unicode 标点符号

我正在尝试创建一个与 UTF-8 编码输入中的任何 Unicode 标点符号匹配的 LPeg 模式。我想出了以下 Selene Unicode 和 LPeg 的结合:

这似乎有效,但它会错过由几个 Unicode 代码点组合而成的标点符号(如果存在这样的字符),因为我只提前读取 4 个字节,它可能会降低解析器的性能,并且它是未定义的库match函数会做,当我给它一个包含矮小的 UTF-8 字符的字符串时(尽管它现在似乎可以工作)。

我想知道这是否是一种正确的方法,或者是否有更好的方法来实现我想要实现的目标。