最简洁的正则表达式检查Ruby,带有捕获和索引

时间:2014-12-21 23:24:47

标签: ruby regex

我想用

if "a string" =~ /(.*)a (.*)/
  # do something with with $1 and $2
end

获取匹配的索引。 =~应该返回索引,但是我没有办法在不使它变得混乱的情况下做到这一点,如:

if index = ("a string" =~ /(.*)a (.*)/) # this is awful
  # would I be able to access $1 and $2 in here?
end

if match = /(.*)a (.*)/.match("a string")
  # access captures via the captures array, but that's gross
  # also, I'd have to manually find the index of the substring
end

那么有一个技巧我不能谷歌吗?另外,我想保持一些性能,所以我不愿意通过map或我见过的其他一些答案来搜索子串的索引。

1 个答案:

答案 0 :(得分:1)

我认为你是对的,你没有任何诡计。

使用=~可以获得索引,但是没有得到匹配的字符串。在找到的索引中,你显然只会得到一个角色,这根本不是你想要的。

# For other readers:

string = "a string"
regexp = /a str/
index = (string =~ regexp)
string[index] #=> 'a' and not 'a str'

使用match,您确实可以获得完全匹配,但在这种情况下,您不会自动获得主字符串中这些捕获的索引。但至少您可以选择手动获取每个捕获的子字符串的索引。

captured_strings.each_with_object({}) do |substring, hash|
  index = string.index(substring)
  hash[index] = substring
end

# note that finding index like that might not always work accurately

我看到它的方式,match是唯一的选择。