Ruby - 提取正则表达式捕获组的最佳方法?

Fre*_*sen 10 ruby regex

我正在阅读一个正则表达式组匹配问题,我看到有两种方法可以从正则表达式中引用捕获组,即,

  1. 匹配字符串方法例如string.match(/(^.*)(:)(.*)/i).captures
  2. Perl 式捕获组变量,例如 $1、$2 等,从 if match =~ /(^.*)(:)(.*)/i
  3. 更新:正如 0xCAFEBABE 提到的,还有第三个选项 - last_match方法

哪个更好?对于 1),为了安全起见,您必须使用 if 语句来防止 nils,那么为什么不直接提取信息呢?而不是调用字符串捕获方法的第二步。所以选项 2) 对我来说看起来更方便。

pap*_*ppy 17

从 v2.4.6 开始,Ruby 有了named_captures,可以这样使用。只需?<some_name>在捕获组中添加语法即可。

/(\w)(\w)/.match("ab").captures # => ["a", "b"]
/(\w)(\w)/.match("ab").named_captures # => {}

/(?<some_name>\w)(\w)/.match("ab").captures # => ["a"]
/(?<some_name>\w)(\w)/.match("ab").named_captures # => {"some_name"=>"a"}
Run Code Online (Sandbox Code Playgroud)

更重要的是,您可以按名称引用命名捕获!

result = /(?<some_name>\w)(\w)/.match("ab")
result["some_name"] # => "a" 
Run Code Online (Sandbox Code Playgroud)