2012-03-15 28 views
5

que parte en los espacios en blanco, punto, coma o comillas dobles, y no en comillas simples:¿Cómo dividir texto en Ruby sin crear cadenas vacías?

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

Cómo quitar elocuente cadenas vacías?

Cómo elocuentemente eliminar cadenas que son más cortas que MIN_LENGTH?

Respuesta

7

La idea de usar split no es correcta en este caso. Deberías estar usando 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"] 

Con el fin de que coincida con cadenas que son MIN_LENGTH o más, lo hacen así:

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

Cuándo utilizar dividida, cuando al utilizar la exploración

  • Cuando los delimitadores son desordenado y hacer que una expresión regular los combine es difícil, use scan.
  • Cuando las subcadenas para extraer son complicadas y hacer una coincidencia de expresiones regulares es difícil, use split.
  • Cuando desee imponer condiciones sobre la forma de las subcadenas que se extraerán, scan.
  • Cuando desee imponer condiciones en la forma de los delimitadores, use split.
+0

Esto es mucho mejor para lo que estaba tratando de hacer. 'split' no es bueno porque tiene que descubrir todos los demás delimitadores posibles, como!, -,?, ~,:, etc. –

+0

Tobias respondió mejor a la primera pregunta:' str.split/[\ s \. , "] + /' –

6

yo creo que una forma sencilla de hacerlo es la siguiente:

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

Obras y fácil de entender. –

1
MIN_LENGTH = 2 

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

Pruebe el siguiente:

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

No estoy del todo claro en el dominio del problema, pero Si solo desea evitar las cadenas vacías, ¿por qué no dividir en una o más ocurrencias de sus separadores?

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

Podemos lograr lo mismo en múltiples formas,

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