2010-08-20 2 views
2

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

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

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

ответ

2
>> '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/Утверждения касательно предшествующего текста, чтобы сделать раскол

>> 'ab2010cd'.split(/(?<=\D)(\d{4})(?=\D)/) 
=> ["ab", "2010", "cd"] 
+0

Очень художественно регулярное выражение :) – Skilldrick

+0

спасибо ~ это хорошо работает делать и знать, как я могу указать область поиска четырехзначный, что только в формах 19XX или 20XX? – es9999

1
ruby-1.9.2-preview1 > "abc1234tgnh".match(/\d{4}/) 
=> #<MatchData "1234"> 
0

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

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

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

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"] 
+0

спасибо ~ он хорошо работает, знаю, как я могу указать поиск на четырехзначный, что только в формах 19XX или 20XX? – es9999

+0

@ es9999, достаточно простой. просто замените '\ d {4}' на '(?: 19 | 20) \ d \ d' –

Смежные вопросы