2012-03-15 11 views
5

Splitting su spazi bianchi, periodo, virgola o virgolette, e non su singoli apici:Come dividere il testo in Ruby senza creare stringhe vuote?

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

come rimuovere eloquenza stringhe vuote?

Come rimuovere in modo eloquente le stringhe più corte di MIN_LENGTH?

risposta

7

L'idea di utilizzare split non è giusto in questo caso. Dovresti usare 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"] 

Al fine di corrispondere le stringhe che sono MIN_LENGTH o più a lungo, fare come questo:

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

Quando usare scissione, quando usare la scansione

  • Quando i delimitatori sono disordinato e fare una regex abbinarli è difficile, usare scan.
  • Quando le sottostringhe da estrarre sono disordinate e fare in modo che le espressioni regolari le corrispondano è difficile, utilizzare split.
  • Quando si desidera imporre condizioni sulla forma delle sottostringhe da estrarre, è scan.
  • Quando si desidera imporre condizioni sul formato dei delimitatori, utilizzare split.
+0

Questo è in realtà molto meglio per quello che stavo cercando di fare. 'split' non va bene perché devi capire tutti gli altri delimitatori possibili, come!, -,?, ~,:, ecc. –

+0

Tobias ha risposto meglio alla prima domanda:' str.split/[\ s \. , "] + /' –

6

penserei un modo semplice per farlo è la seguente:

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

Opere e facile da capire. –

1
MIN_LENGTH = 2 

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

provare il seguito:

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

Io non sono del tutto chiaro sul dominio del problema, ma se vuoi solo evitare le stringhe vuote, perché non dividere su una o più occorrenze dei separatori?

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

Siamo in grado di ottenere lo stesso in vari modi,

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