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

Ale*_*hin 2 regex nim-lang

我想从“some text :some_token”文本中提取“some_token”。

下面的代码返回完整匹配,' :some_token'而不是用'some_token'标记的捕获部分([a-z0-9_-]+)

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 & "'"
Run Code Online (Sandbox Code Playgroud)

如何修改它以仅返回捕获的部分?

聚苯乙烯

另外,renre模块有什么区别?

pie*_*ter 6

提交的代码无法编译(find_bounds返回 atuple[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"]
Run Code Online (Sandbox Code Playgroud)

请注意,上面matches的捕获组必须具有正确的长度(除非您指定正确的长度,否则使用序列将不起作用)。这是一个已知问题rehttps : //github.com/nim-lang/Nim/issues/9472

关于双重存在re,并nre从总结讨论

  • nre具有与(更re接近 C API)不同的 api(更符合人体工程学)
  • nre问题比re过去少,但最近差距已经缩小(另请参阅open regex issues
  • 可能将来nre可能会从 stdlib 中移出并放入一个灵活的包中,但是由于这在 v1 中没有发生,所以它可能不会在 v2 之前发生
  • 请注意,正则表达式 ( nim-regex )有一个纯 nim 实现,它也有一个符合人体工程学的 API。