Как разбить текст в Ruby без создания пустых строк? - PullRequest
6 голосов
/ 15 марта 2012

Разделение на пробелы, точки, запятые или двойные кавычки, а не на одинарные кавычки:

str = %Q{this is the.string    to's split,real "ok" nice-like.}
str.split(/\s|\.|,|"/)
=> ["this", "is", "the", "string", "", "", "", "to's", "split", "real", "", "ok", "", "nice-like"]

Как красноречиво удалить пустые строки?

Как красноречиво удалить строки, которые короче MIN_LENGTH?

Ответы [ 6 ]

8 голосов
/ 15 марта 2012

Я не совсем понимаю проблемную область, но если вы просто хотите избежать пустых строк, почему бы не разбить на одно или несколько вхождений ваших разделителей?

str.split /[\s\.,"]+/
7 голосов
/ 15 марта 2012

Идея использования split в этом случае не верна.Вы должны использовать scan.

str = %Q{this is the.string    to's split,real "ok" nice-like.}
str.scan(/[\w'-]+/)
# => ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"]

Чтобы сопоставить строки MIN_LENGTH или более, выполните следующие действия:

MIN_LENGTH = 3
str.scan(/[\w'-]{#{MIN_LENGTH},}/)
# => ["this", "the", "string", "to's", "split", "real", "nice-like"]

Когда использовать split, когда использовать сканирование

  • Если разделители являются грязными, и сопоставить их с регулярным выражением сложно, используйте scan.
  • Когда извлекаемые подстроки являются грязными изаставить сопоставить их с регулярным выражением сложно, используйте split.
  • Когда вы хотите наложить условия на форму извлекаемых подстрок, вы scan.
  • Когда вы хотитенакладывать условия на форму разделителей, использовать split.
6 голосов
/ 15 марта 2012

Я думаю, что простой способ сделать это заключается в следующем:

str.split(/\s|\.|,|"/).select{|s| s.length >= MIN_LENGTH}
2 голосов
/ 15 марта 2012

Мы можем достичь того же самого несколькими способами,

 > str.split(/[\s\.,"]/) - [""]
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"]

 > str.split(/[\s\.,"]/).select{|sub_string| sub_string.present?}
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"]

 > str.scan /\w+'?\w+/
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice", "like"]
2 голосов
/ 15 марта 2012

Попробуйте следующее:

str.split(/\s*[.,"\s]\s*/)
1 голос
/ 15 марта 2012
MIN_LENGTH = 2

new_strings = str.split(/\s|\.|,|"/).reject{ |s| s.length < MIN_LENGTH }
...