gpt4 book ai didi

regex - 如何在提取匹配项时验证 Ruby 中字符串的格式?

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:45 25 4
gpt4 key购买 nike

我想要什么

  • 验证字符串是否匹配此格式:/^(#\d\s*)+$/ (例如 #1 #2)。

  • 获取所有带哈希值的数字,例如 #<MatchData "1234" 1:"#1" 2:"#2"> .它不必是 MatchData 对象,任何类型的数组、可枚举的都可以。

我的问题

使用 match 时,它只匹配最后一次出现:

/^(#\d\s*)+$/.match "#1 #2"
# => #<MatchData "#1 #2" 1:"#2">

当我使用扫描时,它“有效”:

"#1 #2".scan /#\d/
# => ["#1", "#2"]

但我不相信我可以验证字符串的格式,因为它会为 "aaa #1 #2" 返回相同的格式.

问题

我能否仅通过 1 个方法调用来验证我的字符串是否匹配 /^(#\d\s*)+$/并获取 #number 的所有实例?

因为我已经使用 ruby​​ 有一段时间了,所以问这个问题我有点不好意思。这看起来很简单,但我无法让它发挥作用。

最佳答案

是的,你可以使用

s.scan(/(?:\G(?!\A)|\A(?=(?:#\d\s*)*\z))\s*\K#\d/)

参见 regex demo

详情

  • (?:\G(?!\A)|\A(?=(?:#\d\s*)*\z)) - 两种选择:
    • \G(?!\A) - 上一次成功匹配结束
    • | - 或
    • \A(?=(?:#\d\s*)*\z) - 字符串 (\A) 的开头,后跟 0 或# + digit + 0+ 空格的更多重复,然后是字符串的结尾
  • \s* - 0+ 个空白字符
  • \K - 匹配重置运算符丢弃到目前为止匹配的文本
  • #\d - 一个 # 字符,然后是一个数字

简而言之:首先匹配字符串位置的开头,但前提是右侧的字符串(即整个字符串)与您想要的模式匹配。由于该检查是通过先行执行的,正则表达式索引保持在原来的位置,然后由于 \G 运算符(它匹配字符串的开头或上一场比赛结束,所以 (?!\A) 用于减去开始字符串位置)。

Ruby demo :

rx = /(?:\G(?!\A)|\A(?=(?:#\d\s*)*\z))\s*\K#\d/
p "#1 #2".scan(rx)
# => ["#1", "#2"]
p "#1 NO #2".scan(rx)
# => []

关于regex - 如何在提取匹配项时验证 Ruby 中字符串的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54716310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com