Soy nuevo en las expresiones regulares y agradecería su ayuda. Estoy tratando de armar una expresión que divida la cadena de ejemplo usando todos los espacios que no están rodeados por comillas simples o dobles. Mi último intento se ve así: (?!")
y no funciona del todo. Se divide en el espacio antes de la cita.
Entrada de ejemplo:
This is a string that "will be" highlighted when your 'regular expression' matches something.
Salida deseada:
This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.
Tenga en cuenta eso "will be"
y 'regular expression'
mantenga el espacio entre las palabras.
Respuestas:
No entiendo por qué todos los demás proponen expresiones regulares tan complejas o un código tan largo. Esencialmente, desea tomar dos tipos de cosas de su cadena: secuencias de caracteres que no son espacios ni comillas, y secuencias de caracteres que comienzan y terminan con una cita, sin comillas en medio, para dos tipos de comillas. Puede hacer coincidir fácilmente esas cosas con esta expresión regular:
Agregué los grupos de captura porque no desea las citas en la lista.
Este código Java crea la lista, agregando el grupo de captura si coincidió para excluir las comillas y agregando la coincidencia general de expresiones regulares si el grupo de captura no coincidió (una palabra sin comillas coincidió).
Si no le importa tener las comillas en la lista devuelta, puede usar un código mucho más simple:
fuente
\"
?John's mother
resultados divididos en[John, s, mother]
"([^"]*)"|'([^']*)'|[^\s]+
."([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+
. Ver stackoverflow.com/questions/5695240/…Hay varias preguntas en StackOverflow que cubren esta misma pregunta en varios contextos usando expresiones regulares. Por ejemplo:
ACTUALIZACIÓN : Ejemplo de expresión regular para manejar cadenas entre comillas simples y dobles. Ref: ¿Cómo puedo dividir en una cadena excepto cuando está entre comillas?
Probé esto con un breve fragmento de Perl y el resultado fue como se reproduce a continuación. También funciona para cadenas vacías o cadenas de solo espacios en blanco si están entre comillas (no estoy seguro de si se desea o no).
Tenga en cuenta que esto incluye los caracteres de comillas en los valores coincidentes, aunque puede eliminarlos con un reemplazo de cadena o modificar la expresión regular para no incluirlos. Dejaré eso como un ejercicio para el lector u otro póster por ahora, ya que las 2 am es demasiado tarde para seguir jugando con las expresiones regulares;)
fuente
Si desea permitir comillas de escape dentro de la cadena, puede usar algo como esto:
Las cadenas entre comillas serán el grupo 2, las palabras simples sin comillas serán el grupo 3.
Puede probarlo en varias cadenas aquí: http://www.fileformat.info/tool/regex.htm o http://gskinner.com/RegExr/
fuente
La expresión regular de Jan Goyvaerts es la mejor solución que encontré hasta ahora, pero también crea coincidencias vacías (nulas), que él excluye en su programa. Estas coincidencias vacías también aparecen en los probadores de expresiones regulares (por ejemplo, rubular.com). Si cambia las búsquedas (primero busque las partes citadas y luego las palabras separadas por espacios), entonces puede hacerlo una vez con:
fuente
Esto coincidirá con los espacios que no estén entre comillas dobles. Tengo que usar min, max {0,99999} porque Java no admite * y + en lookbehind.
fuente
Probablemente será más fácil buscar la cadena, agarrar cada parte, en lugar de dividirla.
La razón es que puede dividirlo en los espacios antes y después
"will be"
. Pero, no puedo pensar en ninguna forma de especificar ignorando el espacio entre el interior de una división.(no Java real)
Además, la captura de comillas simples podría generar problemas:
fuente
String.split()
no es útil aquí porque no hay forma de distinguir entre los espacios entre comillas (no dividir) y los que están fuera (dividir).Matcher.lookingAt()
es probablemente lo que necesitas:que produce la siguiente salida:
fuente
Me gustó el enfoque de Marcus, sin embargo, lo modifiqué para permitir texto cerca de las comillas y admitir caracteres "y". Por ejemplo, necesitaba un = "algún valor" para no dividirlo en [a =, " algún valor "].
fuente
El enfoque de Jan es genial, pero aquí hay otro para que conste.
Si realmente desea dividir como se menciona en el título, manteniendo las comillas en
"will be"
y'regular expression'
, entonces puede usar este método que está directamente fuera de Match (o reemplazar) un patrón, excepto en las situaciones s1, s2, s3, etc.La expresión regular:
Las dos alternancias izquierdas coinciden completo
'quoted strings'
y"double-quoted strings"
. Ignoraremos estos partidos. El lado derecho hace coincidir y captura espacios con el Grupo 1, y sabemos que son los espacios correctos porque no se corresponden con las expresiones de la izquierda. Los reemplazamos con ySplitHere
luego los dividimosSplitHere
. Nuevamente, esto es para un verdadero caso dividido en el que lo desea"will be"
, nowill be
.Aquí hay una implementación funcional completa (vea los resultados en la demostración en línea ).
fuente
Si está usando c #, puede usar
He agregado específicamente " | <(? [\ W \ s] *)> " para resaltar que puede especificar cualquier carácter para agrupar frases. (En este caso estoy usando <> para agrupar.
La salida es:
fuente
Estoy razonablemente seguro de que esto no es posible usando solo expresiones regulares. Verificar si algo está contenido dentro de alguna otra etiqueta es una operación de análisis. Esto parece ser el mismo problema que intentar analizar XML con una expresión regular; no se puede hacer correctamente. Es posible que pueda obtener el resultado deseado aplicando repetidamente una expresión regular no codiciosa y no global que coincida con las cadenas entre comillas, luego, una vez que no pueda encontrar nada más, divídalo en los espacios ... que tiene un número de problemas, incluido el seguimiento del orden original de todas las subcadenas. Su mejor opción es escribir una función realmente simple que repita la cadena y extraiga los tokens que desee.
fuente
Esperamos que un par de ajustes útiles en la respuesta aceptada de Jan:
fuente
you're
También puedes probar esto:
fuente
Lo siguiente devuelve una matriz de argumentos. Los argumentos son la variable 'comando' dividida en espacios, a menos que se incluyan entre comillas simples o dobles. Luego, las coincidencias se modifican para eliminar las comillas simples y dobles.
fuente
1er one-liner usando String.split ()
[This, is, a, string, that, "will be", highlighted, when, your, 'regular expression', matches, something.]
no dividir en el espacio en blanco, si el espacio en blanco está rodeado por comillas simples o dobles
dividir en el espacio en blanco cuando los 255 caracteres a la izquierda y todos los caracteres a la derecha del espacio en blanco no son comillas simples ni dobles
adaptado de la publicación original (maneja solo comillas dobles)
fuente