使用Regexp.new从字符串中提取子字符串

时间:2019-03-06 07:10:13

标签: ruby

我有一个像这样的字符串:

var = "Renewal Quote RQ00041233 (Payment Pending) Policy R38A014294-1"

我必须仅使用另一个字符串中包含的信息从该字符串中提取"Payment Pending"

以下内容:

var[/\((.*)\)/, 1]

将提取我想要的内容。我可以在要给定的字符串中包含正则表达式的字符串表示形式,并使用Regexp.new从中构造正则表达式,但是我无法获得用作信息第二个参数的信息1 []

没有第二个参数1

regex_string = '\((.*)\)'
var[Regexp.new(regex_string)]

获取字符串"(Payment Pending)"而不是预期的"Payment Pending"

有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

不确定要执行的操作,但可以使用其他正则表达式摆脱捕获组的作用:

var[/(?<=\().*(?=\))/]
# => "Payment Pending"

var[Regexp.new('(?<=\().*(?=\))')]
# => "Payment Pending"

答案 1 :(得分:1)

/\((.*)\)/只是Regexp.new('\((.*)\)')的简写。

String#[]将正则表达式和捕获组作为两个单独的参数。 var[/\((.*)\)/, 1]var[Regex, 1]

要意识到的重要一点是1是传递给var[]而不是正则表达式的。

re = Regexp.new('\((.*)\)')
match = var[re, 1]

注意:您可能需要一个命名的捕获组而不是一个编号的捕获组。意外地在正则表达式中包含一个额外的捕获组非常容易。

答案 2 :(得分:1)

假设字符串中没有嵌套的括号,则不使用正则表达式的一种方法如下。

instance_eval "var[(i=var.index('(')+1)..var.index(')',i)-1]"
  #=> "Payment Pending"

请参见String#index,尤其是对可选的第二个参数“偏移”的引用。