Регулярно оставляйте желаемую строку, а остальные удаляйте. - PullRequest
1 голос
/ 01 февраля 2011

В Ruby, какое регулярное выражение удалит все, кроме желаемой строки, если присутствует в содержащей строке? Я знаю о /[^abc]/ для символов, но как насчет строк?

Скажите, у меня есть строка "group=4&type_ids[]=2&type_ids[]=7&saved=1" и я хочу сохранить шаблон group=\d, если он присутствует в строке, используя только регулярное выражение?

В настоящее время я делю на &, а затем делаю выборку с условием соответствия =~ /group=\d/ в результирующей перечисляемой коллекции. Это прекрасно работает, но я хотел бы знать, регулярное выражение, чтобы сделать это более напрямую.

Ответы [ 4 ]

2 голосов
/ 01 февраля 2011

Просто:
part = str[/group=\d+/]

Если вы хотите только цифры, то:
group_str = str[/group=(\d+)/,1]

Если вы хотите, чтобы в качестве целого числа были только цифры, то:
group_num = str[/group=(\d+)/,1].to_i

Предупреждение: String#[] вернет nil, если совпадений не будет, а слепой вызов nil.to_i всегда возвращает 0.

1 голос
/ 01 февраля 2011

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

asdf = "group=4&type_ids[]=2&type_ids[]=7&saved=1"

asdf.split('&').select{ |q| q['group'] } # => ["group=4"]

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

asdf.scan(/group=\d+/) # => ["group=4"]
asdf[/(group=\d+)/, 1] # => "group=4"
1 голос
/ 01 февраля 2011

Вы можете попробовать:

$str =~ s/.*(group=\d+).*/\1/;
0 голосов
/ 01 февраля 2011

Попробуйте:

str.match(/group=\d+/)[0]
...