Después de de esta larga búsqueda de datos dimos con la respuesta este dilema que suelen tener algunos los usuarios. Te regalamos la respuesta y nuestro objetivo es serte de gran ayuda.
Solución:
No entiendo por qué todos los demás proponen expresiones regulares tan complejas o un código tan largo. Esencialmente, desea obtener dos tipos de cosas de su string: secuencias de caracteres que no son espacios ni comillas, y secuencias de caracteres que comienzan y terminan con una comilla, sin comillas intermedias, para dos tipos de comillas. Puede hacer coincidir fácilmente esas cosas con esta expresión regular:
[^s"']+|"([^"]*)"|'([^']*)'
Agregué los grupos de captura porque no quieres las comillas en la lista.
Este código Java construye la lista, agregando el grupo de captura si coincidía para excluir las comillas, y agregando la coincidencia general de expresiones regulares si el grupo de captura no coincidía (coincidió una palabra sin comillas).
List matchList = new ArrayList();
Pattern regex = Pattern.compile("[^\s"']+|"([^"]*)"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find())
if (regexMatcher.group(1) != null)
// Add double-quoted string without the quotes
matchList.add(regexMatcher.group(1));
else if (regexMatcher.group(2) != null)
// Add single-quoted string without the quotes
matchList.add(regexMatcher.group(2));
else
// Add unquoted word
matchList.add(regexMatcher.group());
Si no le importa tener las comillas en la lista devuelta, puede usar un código mucho más simple:
List matchList = new ArrayList();
Pattern regex = Pattern.compile("[^\s"']+|"[^"]*"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find())
matchList.add(regexMatcher.group());
Hay varias preguntas en StackOverflow que cubren esta misma pregunta en varios contextos usando expresiones regulares. Por ejemplo:
- análisis de cadenas: extracción de palabras y frases
- La mejor manera de analizar texto separado por espacios
ACTUALIZAR: Regex de muestra para manejar cadenas entre comillas simples y dobles. Ref: ¿Cómo puedo dividir en un string excepto cuando dentro de comillas?
m/('.*?'|".*?"|S+)/g
Probé esto con un fragmento rápido de Perl y el resultado fue el que 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 si eso se desea o no).
This
is
a
string
that
"will be"
highlighted
when
your
'regular expression'
matches
something.
Tenga en cuenta que esto incluye los caracteres de comillas en los valores coincidentes, aunque puede eliminarlos con un string reemplace o modifique la expresión regular para no incluirlos. Dejaré eso como un ejercicio para el lector u otro afiche por ahora, ya que las 2 am es demasiado tarde para seguir jugando con expresiones regulares;)
Si desea permitir comillas escapadas dentro del stringpuedes usar algo como esto:
(?:(['"])(.*?)(?\\)*1|([^s]+))
Las cadenas entre comillas serán el grupo 2, las palabras sueltas 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/