Ruby-提取正则表达式捕获组的最佳方法?
我在读一个问题,我发现有两种方法可以引用正则表达式中的捕获组,即Ruby-提取正则表达式捕获组的最佳方法?,ruby,regex,Ruby,Regex,我在读一个问题,我发现有两种方法可以引用正则表达式中的捕获组,即 字符串方法,例如string.match(/(^.*)(:)(.*)/i)。捕获 从if match=~/(^.*)(:)(.*)/i 更新:正如0xCAFEBABE提到的,还有第三个选项-方法 哪个更好?对于1),为了安全起见,您必须使用if语句来防范nils,那么为什么不直接提取信息呢?而不是第二步调用string captures方法。因此,选项2)对我来说更方便。对于简单的任务,直接访问伪变量$1等可能会更简单,但当事情变
string.match(/(^.*)(:)(.*)/i)。捕获
if match=~/(^.*)(:)(.*)/i
哪个更好?对于1),为了安全起见,您必须使用if语句来防范nils,那么为什么不直接提取信息呢?而不是第二步调用string captures方法。因此,选项2)对我来说更方便。对于简单的任务,直接访问伪变量
$1
等可能会更简单,但当事情变得复杂时,通过匹配数据
实例访问东西(几乎)是唯一的方法
例如,假设您正在执行嵌套的gsub
:
string1.gsub(regex1) do |string2|
string2.gsub(regex2) do
... # Impossible/difficult to refer to match data of outer loop
end
end
在内部循环中,假设您希望引用外部gsub
的捕获组。调用$1
、$2
等将不会给出正确的结果,因为通过执行内部gsub
循环,最后一个匹配数据已更改。这将是一个错误的来源
有必要通过匹配数据引用捕获的组:
string1.gsub(regex1) do |string2|
m1 = $~
string2.gsub(regex2) do
m2 = $~
... # match data of the outer loop can be accessed via `m1`.
# match data of the inner loop can be accessed via `m2`.
end
end
简言之,如果您想为简单的任务做一些简短的黑客行为,可以使用伪变量。如果你想让你的代码更加结构化和可扩展,你应该通过匹配数据来访问数据。自v2.4.6以来,Ruby已经有了名为的捕获,可以这样使用。只需在捕获组中添加
?
语法即可
/(\w)(\w)/.match(“ab”).捕获#=>[“a”,“b”]
/(\w)(\w)/.match(“ab”).named_捕获#=>{}
/(?\w)(\w)/.match(“ab”).捕获#=>[“a”]
/(?\w)(\w)/.match(“ab”).named#u捕获#=>{“some_name”=>“a”}
更重要的是,您可以通过名称引用命名捕获
result=/(?\w)(\w)/.match(“ab”)
结果[“某个名称”]#=>“a”
甚至还有第三个:。哦,好吧,timtowtdi。没有匹配类。你可能是说MatchData
class.@sawa我的错,这是一个字符串方法,我已经更新了这个问题。对于现代Ruby,大约2020年,这是正确的答案。