微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何获取Nim中正则表达式的捕获部分

我想从“ 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 & "'"

如何修改它以仅返回捕获的零件?

P.S。

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

解决方法

提交的代码无法编译(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的双重存在,总结自this discussion

  • nrere(更接近C API)具有不同的api(更符合人体工程学)
  • nre的问题比过去的re少,但这种差距最近已消除(另见open regex issues
  • 也许将来nre可能会从stdlib中移出并放入灵活的软件包中,但是由于v1中没有发生这种情况,因此可能不会在v2之前发生
  • 请注意,有一个正则表达式(nim-regex)的纯nim实现,还具有符合人体工程学的API。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。