RegEx-golf: unir todos los contenidos en una cadena

10

Su tarea es escribir un RegEx que coincida con todo dentro de las cadenas.

Una cadena se define como todo rodeado por (pero sin incluir) dos sin escape ".

Se "puede escapar por A \, que también se puede escapar nuevamente.

Casos de prueba

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Puntuación

La solución más corta gana.

Especificaciones

  • Por favor, especifique el sabor utilizado.
  • La entrada se habrá equilibrado ".
  • No habrá ninguno \que preceda inmediatamente a un delimitador de inicio de cadena. Por ejemplo, no necesitaría manejarabc\"def"
Monja permeable
fuente
1
¿Habrá \antes de una cadena? Por ejemplo abc\"def".
jimmy23013
¿Debería coincidir con cada cadena en un grupo? Por ejemplo, ¿podría escribir algo que tenga dos coincidencias abc"de", una es dy la otra es e?
jimmy23013
Está permitido .
Leaky Nun
¿Habrá cadenas vacías?
Martin Ender
Sí, habrá cadenas vacías.
Leaky Nun

Respuestas:

3

PCRE, 21 20 15 19 bytes

(.|^)"\K(\\.|[^"])*

Pruébalo aquí.

Esto coincide con un carácter (o el comienzo de la entrada) antes de la comilla doble inicial y luego restablece la coincidencia, para asegurarse de que la comilla doble no se comparta con otra coincidencia.

PCRE, 25 23 bytes

Gracias a Martin Büttner por jugar golf en 2 bytes.

(\\.|[^"])*+(?!"(?R)|$)

Pruébalo aquí.

Explicación

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Tenga en cuenta que el cuantificador posesivo ( *+) se aseguró de que la búsqueda anticipada negativa siempre comience después de una cadena completa o un segmento completo de no cadena.

Hay 4 casos:

  • El partido comienza en cualquier lugar fuera de una cadena. \\.nunca coincidiría con una comilla doble según la aclaración. Solo podría terminar justo antes de la próxima comilla doble que comienza una cadena, o el final de la entrada. Ambos casos falla la anticipación negativa.
  • El partido comienza al comienzo de una cadena. (\\.|[^"])*+coincidiría con una cadena completa. El siguiente carácter debe ser una comilla doble y no puede ser el final de la entrada. Después de la comilla doble está fuera de la cadena, por lo que no podría ser otra coincidencia. Entonces pasa la mirada negativa hacia adelante.
  • El partido comienza al final de una cadena. Coincide con una cadena vacía de la misma manera que el caso anterior. Pero no importa según la aclaración.
  • El partido comienza en el medio de una cadena. Imposible porque los partidos no se superponen.
jimmy23013
fuente
Funcionaria (\\.|[^"])?
Martin Ender
@ MartinBüttner que coincide con todo excepto "
Bálint
@ Bálint quise decir en lugar de ([^\\"]|\\.), no como la solución completa.
Martin Ender
@ MartinBüttner Oh, ok
Bálint
La sugerencia de Martin debería funcionar, ya que \\.solo falla cuando no hay un carácter después \(o un nuevo carácter de línea, pero eso se puede arreglar con la bandera), y ese caso está cubierto por la mirada negativa. El cuantificador posesivo evita el retroceso, por lo que no tenemos otro caso para mirar.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
0

JavaScript, 24 bytes

"([^"\\]*(?:\\.[^"\\]*)*)"

El grupo 1 es el contenido de la cadena.

Quién diablos es él
fuente
Esto no funciona en absoluto con las comillas escapadas y, por lo tanto, no cumple con las especificaciones.
ATaco
Ah sí, lo siento. ¿Qué hay sobre eso?
Whothehellisthat
Cerca, pero no puro, que no debería estar emparejando los exteriores "s
ataco
Sí, eso es lo que me daba miedo. ¿No hay forma de hacerlo en JavaScript, supongo?
Whothehellisthat
Puede capturarlo en un subgrupo
ATaco
0

JavaScript, 21 15 13 12 bytes

"((\\?.)*?)"

El contenido de la cadena está en el grupo 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
12Me21
fuente