2015-03-31 8 views
0

Я пытаюсь написать метод вытаскивает каждую строку, которая соответствует критериям, из большого текстового файла:Строка вопрос синтаксиса соответствия регулярных выражений

  • Каждый элемент отделяется запятой
  • Первые 5 элементов может быть любое число от 1-59
  • следующие 21 элементы должны быть числами от 1-5
  • следующие 27 элементов могут быть либо истинными, либо ложными (без крышки)
  • конечные элементы 5 представляют собой целые числа от 1 -5

Мой код:

#this string should be returned by the regex matching 
str="3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3" 
matchResult=/[1-59]{5}[1-5]{21}[true|false]{27}[1-5]{5}/.match(str) 
matchResult.each{|x| #this doesnt work....why? 
    puts x 
} 
  • Что такое правильный способ напечатать все матчи? matchResult.each вызывает ошибку. Я думал, что он вернул массив матчей.
  • Как настроить регулярное выражение, чтобы ожидать запятую между каждым значением (а не в конце строки)?

ответ

1

Помещенный истинным или ложным внутри захвата группы или не захватив группу как (?:true|false) так, что она будет соответствовать точному true или false подстроку, это [true|false] будет соответствовать один символ может только будь то t или r или u или e или |, ....

> str="3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3" 
> str.match(/^(?:[1-5]\d|[1-9])(?:,(?:[1-5]\d|[1-9])){4}(?:,[1-5]){21}(?:,(?:true|false)){27}(?:,[1-5]){5}$/) 
=> #<MatchData "3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3"> 
+0

некоторые из моих строк могут иметь запятую в начале. Есть ли способ настроить регулярное выражение для этого? Я попытался: (/^(?: [,] *) (?: [1-5] \ d | [1-9]) (?:, (?: [1-5] \ d | [1-9 ])) {4} (:, [1-5]) {21} (:, (?: истинно | ложно)) {27} (?:?, [1-5]) {5} $ /) но что не работает – Rilcon42

+0

как выглядит ваша строка? –

+0

str = ", 3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3 , 2,4,3, ложь, ложь, ложь, ложь, ложь, истина, ложь, истина, ложь, ложь, ложь, ложь, ложь, ложь, ложь, истина, ложь, ложь, ложь, ложь, ложь, ложь , false, false, false, false, false, 3,3,3,2,3 " – Rilcon42

1

Что касается вашего первого вопроса:

«Каков правильный способ печати всех совпадений? matchResult.each выдает ошибку. Я думал, что он вернулся массив матчей «

Метод Regex .match не возвращает массив совпадений;. Она возвращает либо объект соответствия (в данном случае, строки, так что вы звоните .match на строку) или ноль, если нет совпадений (see docs here).

Это означает, что matchResult является строкой, и вы не можете позвонить .each на строку, поэтому вы получаете сообщение об ошибке, см. this post более info на .each & строки.

+0

Спасибо, ты указал мне в правильном направлении. Оказывается, мне пришлось использовать сканирование, а не матч – Rilcon42

+0

Нет проблем, рад, что это помогло. И использование '.scan' вместо этого имеет смысл. Хорошая работа, работающая над этим. – ktravers

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