Как извлечь год через регулярное выражение из строки в Ruby - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь извлечь год из строки в следующем формате:

dataset_name = 'ALTVALLEDAOSTA000020191001.json'

Я пытался:

dataset_name[/<\b(19|20)\d{2}\b>/, 1]
/\b(19|20)\d{2}\b/.match(dataset_name)

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

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Есть много способов добраться до Рима.

Начиная с:

foo = 'ALTVALLEDAOSTA000020191001.json'

Удаление расширенного имени файла + расширение до basename, затем с помощью регулярное выражение:

ymd = /(\d{4})(\d{2})(\d{2})$/
ext = File.extname(foo)
File.basename(foo, ext) # => "ALTVALLEDAOSTA000020191001"

File.basename(foo, ext)[ymd, 1] # => "2019"
File.basename(foo, ext)[ymd, 2] # => "10"
File.basename(foo, ext)[ymd, 3] # => "01"

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

ymd = /^.*(\d{4})/
foo[ymd, 1] # => "1001"

или извлечение года, месяца и дня:

ymd = /^.*(\d{4})(\d{2})(\d{2})/
foo[ymd, 1] # => "2019"
foo[ymd, 2] # => "10"
foo[ymd, 3] # => "01"

Использование String's unpack:

ymd = '@18A4'
foo.unpack(ymd)  # => ["2019"]

или:

ymd = '@18A4A2A2'
foo.unpack(ymd)  # => ["2019", "10", "01"]

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

1 голос
/ 22 марта 2020

Поскольку имя вашего набора данных всегда заканчивается на yyyymmdd.json, вы можете взять часть последних 13-9 символов, считая сзади:

irb(main):001:0> dataset_name = 'ALTVALLEDAOSTA000020191001.json'
irb(main):002:0> dataset_name[-13...-9]
=> "2019"

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

irb(main):003:0> dataset_name =~ /(\d{4})\d{4}\.json$/
=> 18
irb(main):004:0> $1
=> "2019"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...