Рубин: определить четырехзначные числа и вырезать текст - PullRequest
2 голосов
/ 20 августа 2010

так что я имею дело с текстом (в строке), содержащим много чисел года (четыре цифры), я пытаюсь разделить текст на сегменты, каждый из которых начинается и заканчивается номером года (не имеет значения если номер года включен в сегмент). в основном цифры года действуют как сигнал для кода «вырезать».

есть идеи, как я могу это сделать? как определить четырехзначный номер

спасибо миллион!

Ответы [ 3 ]

2 голосов
/ 20 августа 2010
>> 'ab2010cd'.scan(/\D(\d{4})\D/)   # 4 digit numbers match
=> [["2010"]]
>> 'ab201cd'.scan(/\D(\d{4})\D/)    # <4 digit numbers don't match
=> []
>> 'ab20101cd'.scan(/\D(\d{4})\D/)  # >4 digit numbers don't match
=> []
>>

в ruby1.9 вы можете использовать утверждения lookahead / lookbehind для разделения

>> 'ab2010cd'.split(/(?<=\D)(\d{4})(?=\D)/)
=> ["ab", "2010", "cd"]
1 голос
/ 20 августа 2010
ruby-1.9.2-preview1 > "abc1234tgnh".match(/\d{4}/)
 => #<MatchData "1234"> 
0 голосов
/ 20 августа 2010

Учитывая строку

s = 'abcd 1234 efghijk 56789 nope 0987 blah blah 2010 hmmm'

Должно ли быть 2 или 3 совпадения (учитывая, что подстрока "2010 ммм" не заканчивается годом)? Я предполагаю, что вы хотите соответствовать этому (если нет, удалите |\Z из регулярного выражения).

s.scan(/\b\d{4}\b.+?(?=\b\d{4}\b|\Z)/)
# => ["1234 efghijk 56789 nope ", "0987 blah blah ", "2010 hmmm"]

Но, как вы говорите, вы не заботитесь о сохранении чисел:

s.scan(/(?<=\d{4}).+?(?=\b\d{4}\b|\Z)/)
# => [" efghijk 56789 nope ", " blah blah ", " hmmm"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...