gpt4 book ai didi

ruby - 返回匹配的可选模式

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:25 25 4
gpt4 key购买 nike

我想知道如何获得匹配正则表达式中的模式。

我有这个正则表达式(我在 Ruby 中使用 .match):

(?i)(penalty is\W+[0-9]+\W+night)|(penalty of\W+[0-9]+\W+)

现在我知道如何在字符串中返回匹配的文本,但是有没有办法获取匹配的字符串和该字符串的匹配模式?所以我会有两个结果:

  1. 字符串中的匹配文本:惩罚是 1 晚
  2. 匹配的模式:(惩罚是\W+[0-9]+\W+night)

最好的问候。

最佳答案

pattern = /(?i)(penalty is\W+[0-9]+\W+night)|(penalty of\W+[0-9]+\W+)/

"penalty of 123 points".match(pattern)
=> #<MatchData "penalty of 123 " 1:nil 2:"penalty of 123 ">

非零捕获号揭示了模式的哪一部分匹配。您可以通过多种方式获取此值,例如:

"penalty of 123 points".match(pattern).captures
=> [nil, "penalty of 123 "]

# Get the index of the first *non-nil* element:
"penalty of 123 points".match(pattern).captures.find_index(&:itself)
=> 1

因此,根据上面的方法链返回的是 0 还是 1,您将知道第一组还是第二组匹配。

如果你想让这段代码更透明一点(更容易理解它是如何工作的),你也可以考虑使用一个命名捕获组,例如:

pattern = /(?i)(?<night>penalty is\W+[0-9]+\W+night)|(?<other>penalty of\W+[0-9]+\W+)/

"penalty of 123 points".match(pattern)
=> #<MatchData "penalty of 123 " night:nil other:"penalty of 123 ">

"penalty of 123 points".match(pattern).named_captures
=> {"night"=>nil, "other"=>"penalty of 123 "}

"penalty of 123 points".match(pattern).named_captures.compact.keys.first
=> "other"

要更进一步,您还可以将每个“子模式”定义为不同的正则表达式以供将来引用,并将它们连接在一起以进行主匹配,例如:

groups = {
"night" => /(?<night>penalty is\W+[0-9]+\W+night)/i,
"other" => /(?<other>penalty of\W+[0-9]+\W+)/i
]

pattern = Regexp.union(groups)

match_group_name = "penalty of 123 points".match(pattern).named_captures.compact.keys.first

puts "Pattern that matched: #{groups[match_group_name]}"

关于ruby - 返回匹配的可选模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458660/

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