Извлечение подстроки из строки с помощью `Regexp.new` - PullRequest
0 голосов
/ 06 марта 2019

У меня есть такая строка:

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 ]

3 голосов
/ 06 марта 2019

Не уверен, что вы пытаетесь сделать, но вы можете избавиться от захвата групп, используя другое регулярное выражение:

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

или

var[Regexp.new('(?<=\().*(?=\))')]
# => "Payment Pending"
1 голос
/ 06 марта 2019

Если в строке нет вложенных скобок, один из способов сделать это без использования регулярного выражения заключается в следующем.

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

См. String # index , в частности ссылку на необязательный второй аргумент "offset".

1 голос
/ 06 марта 2019

/\((.*)\)/ это просто сокращение для Regexp.new('\((.*)\)').

String#[] принимает регулярное выражение и группу захвата в качестве двух отдельных аргументов.var[/\((.*)\)/, 1] - это var[Regex, 1].

Важно понять, что 1 передается в var[], а не в регулярное выражение.

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

Примечание: может потребоватьсяименованная группа захвата, а не пронумерованная.Очень легко случайно включить в регулярное выражение дополнительную группу захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...