如何在Nim中捕获正则表达式的部分

3
我想从文本“some text: some_token”中提取“some_token”。 下面的代码返回完整匹配项':some_token',而不是用'[a-z0-9_-]+'标记的捕获部分'some_token'。
import re

let expr = re("\\s:([a-z0-9_-]+)$", flags = {re_study, re_ignore_case})
for match in "some text :some_token".find_bounds(expr):
  echo "'" & match & "'"

如何修改代码使其只返回被捕获的部分?

P.S.

renre模块有什么区别?

1个回答

7
提交的代码无法编译(find_bounds 返回一个 tuple[first, last: int],而不是可以用 for 迭代的东西)。然而,在这个示例中,find_bounds确实会给出整个模式的索引边界,而不是捕获子字符串。
以下链接提供的代码(https://play.nim-lang.org/#ix=2yvs)可用于获取捕获的字符串:
import re

let expr = re("\\s:([a-z0-9_-]+)$", flags = {re_study, re_ignore_case})
var matches: array[1, string]
if "some text :some_token".find(expr, matches) >= 0:
  echo matches  # -> ["some_token"]

请注意,上述代码中的matches必须具有捕获组的正确长度(除非您指定了正确的长度,否则使用序列将无法工作)。这是re的已知问题:https://github.com/nim-lang/Nim/issues/9472 关于renre的双重存在,总结自此讨论
  • nre拥有不同于re(更贴近C API)的API(更符合人体工程学)。
  • nre过去比re少出现一些问题,但最近时间内差距已经缩小(也请参阅打开的正则表达式问题)。
  • 在未来,可能会将nre从stdlib中移出并放入nimble包,但既然这在v1之前没有发生,那么在v2之前可能不会发生。
  • 请注意,还有一个纯Nim实现的正则表达式(nim-regex),它也有一种符合人体工程学的API。

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