2012-03-15 34 views
5

Splitting trên khoảng trắng, khoảng thời gian, dấu phẩy hoặc dấu ngoặc kép, và không phải trên dấu nháy đơn:Làm thế nào để tách văn bản trong Ruby mà không tạo chuỗi rỗng?

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

Làm thế nào để loại bỏ hùng hồn chuỗi rỗng?

Làm cách nào để xóa các chuỗi ngắn hơn MIN_LENGTH?

Trả lời

7

Ý tưởng sử dụng split không đúng trong trường hợp này. Bạn nên sử dụng 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"] 

Để phù hợp với chuỗi được MIN_LENGTH hoặc lâu hơn, làm như thế này:

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

Khi sử dụng tách, khi nào sử dụng quét

  • Khi delimiters là lộn xộn và làm cho một regex phù hợp với họ là khó khăn, sử dụng scan.
  • Khi các chất nền để trích xuất là lộn xộn và làm cho một regex phù hợp với họ là khó khăn, sử dụng split.
  • Khi bạn muốn áp đặt các điều kiện về hình thức của các chất nền được trích xuất, bạn scan.
  • Khi bạn muốn áp đặt các điều kiện trên biểu mẫu các dấu phân tách, hãy sử dụng split.
+0

Điều này thực sự tốt hơn cho những gì tôi đang cố gắng làm. 'split' không tốt vì bạn phải tìm ra tất cả các dấu phân cách có thể khác, như!, -,?, ~,:, v.v. –

+0

Tobias trả lời câu hỏi đầu tiên tốt nhất:' str.split/[\ s \. , "] + /' –

6

Tôi sẽ nghĩ một cách đơn giản để làm điều đó là như sau:

str.split(/\s|\.|,|"/).select{|s| s.length >= MIN_LENGTH} 
+0

trình và dễ hiểu. –

1
MIN_LENGTH = 2 

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

Thử dưới đây:

str.split(/\s*[.,"\s]\s*/) 
8

Tôi không hoàn toàn rõ ràng về vấn đề tên miền, nhưng nếu bạn chỉ muốn tránh các chuỗi trống, tại sao không chia tách trên một hoặc nhiều lần xuất hiện trong số các dấu tách của bạn?

str.split /[\s\.,"]+/ 
2

Chúng ta có thể đạt được như vậy theo nhiều cách,

> 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"] 
Các vấn đề liên quan