Pregunta

Dado el siguiente tipo de cadena:

"#First Thing##Another One ## No Space#Cadena principal #After Main##Endstring#"

Me gustaría encontrar una expresión regular que pueda devolver todo el texto rodeado por los símbolos # como coincidencias. Una de las cosas que me dan dolor es el hecho de que el símbolo # es tanto el delimitador de apertura como de cierre. Todos mis intentos en una regex acaban de devolver toda la cadena. El otro problema es que es posible que parte de la cadena no esté rodeada de # símbolos, como lo demuestra la "cadena principal" de la subcadena arriba. ¿Alguien tiene alguna idea? He jugado un poco con una afirmación negativa de apariencia, pero no he podido hacer que funcione. Puede o no haber un espacio entre los grupos de #, pero quiero ignorarlos (no coincidir con ellos) si lo hay. La otra opción sería simplemente escribir una rutina de analizador de cadenas, que sería bastante fácil, pero preferiría usar una regex si es posible.

¿Fue útil?

Solución

Editar

Creo que esto es lo que necesitas:

(?<=#)[^#]+?(?=#)

Con entrada #First Thing# #Another One##No Space# Main String #After Main# partidos:

  • First Thing
  • Another One
  • No Space
  • Main String
  • After Main

El segundo partido es el espacio entre Thing# y #Another.

Editar] para ignorar el espacio:

(?<=)(?!\s+)[^#]+?(?=#)

Si quieres ignorar los espacios finales:

(?<=)(?!\s+)[^#]+?(?=\s*#)

Otros consejos

/((#[^#]+#)|([^#]+))/

Quizás algo como lo anterior coincidirá con lo que quieres.

Esto coincidirá con el espacio entre dos hashes. Mmm.

/((#[^#]+#)|([^#]*[^#\s]+[^#]*))/

Eso eliminará el desagradable espacio, creo.

Prueba esto. Los primeros y últimos grupos no deben ser capturados y el.*? debiera ser perezoso

(?:#)(.*?)(?:#)

Creo que esto es lo que realmente necesitas:

((#[^#]+#)|([^#]*[^#\s]+[^#]*))

Pero no capturará el #está cerca Main String

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top