2011-03-13 22 views
6

tengo alguna cadena, que se parece a:¿Cómo dividir esta cadena por regex?

div#title.title.top 
#main.main 
a.bold#empty.red 

Son similares a haml, y quiero mediante su división en expresiones regulares, pero yo no sé cómo definirlo.

val r = """???""".r // HELP 
val items = "a.bold#empty.red".split(r) 
items // -> "a", ".bold", "#empty", ".red" 

¿Cómo hacer esto?


ACTUALIZACIÓN

En este momento, todo el mundo, pero tengo que hacer esta pregunta más difícil. Estoy muy interesado en

val r = """(?<=\w)\b""" 

Pero un error al analizar los más complejos:

div#question-title.title-1.h-222_333 

espero que será analizado a:

div 
#question-title 
.title-1 
.h-222_333 

Quiero saber cómo mejorar esa expresión regular?

+1

Bueno, ¿qué esperas? Realmente no has explicado cuáles son tus expectativas. –

Respuesta

2

no estoy completamente seguro de lo que necesita aquí, pero esto debería ayudar:

(?:\.|#)?\w+ 

Significa una "expresión" se define como un punto opcional o de hash seguida de algunos caracteres de palabra.

Usted va a terminar con:

div 
#title 
.title 
.top 
#main 
.main 
a 
.bold 
#empty 
.red 
8
val r = """(?<=\w)\b(?!-)""" 

Nota esa fracción de toma String que representa una expresión regular, no un Regex, por lo que no debe convertir r a partir String a Regex.

Breve explicación de la expresión regular:

  • (?<=...) es una mirada atrás. Establece que esta coincidencia debe ir precedida por el patrón ... o, en su caso \w, lo que significa que desea que el patrón siga un dígito, una letra o un subrayado.

  • \b significa límite de palabra. Es una coincidencia de longitud cero que ocurre entre un carácter de palabra (dígitos, letras y guión bajo) y un carácter sin palabra, o viceversa. Como es de longitud cero, split no eliminará ningún carácter al dividirse.

  • (?!...) tiene un aspecto negativo. Aquí uso para decir que no me interesan los límites de palabras de una letra a un guión.

3

A partir de la respuesta de Josh M, que tiene una buena expresión regular, pero desde split toma una expresión regular que coincide con el "delimitador", es necesario utilizar findAllIn de la siguiente manera:

val r = """(?:\.|#)?\w+""".r 
val items = r findAllIn "a.bold#empty.red" 
    //maybe you want a toList on the end also 

A continuación, obtener los resultados

div#title.title.top -> List(div, #title, .title, .top) 
#main.main    -> List(#main, .main) 
a.bold#empty.red  -> List(a, .bold, #empty, .red) 
+0

Sí, no sabía \ no sé los detalles de la función en cuestión. –

+0

muchas gracias. Pero como @Josh es el primero que me da la respuesta correcta, entonces decido aceptar su respuesta. – Freewind

Cuestiones relacionadas