Как получить конкретную часть регулярного выражения соответствия строк в Ruby? - PullRequest
11 голосов
/ 22 июня 2010

У меня есть строка Unnecessary:12357927251data, и мне нужно выбрать все данные после двоеточия и чисел. Я сделаю это с помощью регулярных выражений.

string.scan(/:\d+.+$/)

Это даст мне :12357927251data, но я могу выбрать только необходимую информацию .+ (data)?

Ответы [ 5 ]

20 голосов
/ 22 июня 2010

Все, что в скобках в регулярном выражении, будет записано в виде группы, к которой вы можете получить доступ в $1, $2 и т. Д. Или с помощью [] для объекта сопоставления:

string.match(/:\d+(.+)$/)[1]

Если вы используете сканирование с захватом групп, вы получите массив массивов групп:

"Unnecessary:123data\nUnnecessary:5791next".scan(/:\d+(.+)$/)
=> [["data"], ["next"]]
3 голосов
/ 22 июня 2010

Используйте скобки в вашем регулярном выражении, и результат будет разбит на массив. Например:

x='Unnecessary:12357927251data'
x.scan(/(:\d+)(.+)$/)
=> [[":12357927251", "data"]]
x.scan(/:\d+(.+$)/).flatten
=> ["data"]
1 голос
/ 22 июня 2010

Предполагая, что вы пытаетесь получить строку 'data' из вашей строки, вы можете использовать:

string.match(/.*:\d*(.*)/)[1]

String # match возвращает объект MatchData. Затем вы можете проиндексировать этот объект MatchData, чтобы найти нужную часть строки.

(первый элемент MatchData является исходной строкой, второй элемент является частью строки, захваченной скобками)

1 голос
/ 22 июня 2010

Попробуйте это: /(?<=\:)\d+.+$/

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

0 голосов
/ 22 июня 2010

Использование IRB

irb(main):004:0> "Unnecessary:12357927251data".scan(/:\d+(.+)$/)
=> [["data"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...