línea de expresiones regulares por la línea: ¿Cómo adaptar triples comillas comillas pero no dobles

StackOverflow https://stackoverflow.com/questions/1494929

  •  18-09-2019
  •  | 
  •  

Pregunta

Tengo que comprobar para ver si una cadena de muchas palabras / letras / etc, contiene sólo 1 juego de triples comillas dobles (es decir, "" "), pero también puede contener individuales dobles comillas (") y doble doble -quotes ( ""), utilizando una expresión regular. no han tenido mucho éxito hasta el momento.

¿Fue útil?

Solución

Una expresión regular con la búsqueda negativa hacia delante puede hacerlo:

(?!.*"{3}.*"{3}).*"{3}.*

Lo he probado con estas líneas de código Java:

String good = "hello \"\"\" hello \"\" hello ";
String bad = "hello \"\"\" hello \"\"\" hello ";
String regex = "(?!.*\"{3}.*\"{3}).*\"{3}.*";
System.out.println( good.matches( regex ) );
System.out.println( bad.matches( regex ) );

... con la salida:

true
false

Otros consejos

Trate de usar el número de ocurrencias del operador para que coincida exactamente tres comillas dobles.

  • \ "{3}
  • [ "] {3}
  • [\ "] {3}

He comprobado rápidamente usando http://www.regextester.com/ , parece funcionar bien.

¿Cómo se compila correctamente la expresión regular en su idioma de elección puede variar, sin embargo!

depende de su idioma, pero sólo debería ser necesario para que coincida con tres comillas dobles (por ejemplo, /\"{3}/) y luego contar los partidos para ver si hay exactamente una.

Probablemente hay un montón de maneras de hacer esto, pero un simple Una es mirar simplemente por múltiples ocurrencias de comillas triples luego invertir la expresión regular. He aquí un ejemplo de Perl:

use strict;
use warnings;

my $match = 'hello """ hello "" hello';
my $no_match = 'hello """ hello """ hello';
my $regex = '[\"]{3}.*?[\"]{3}';

if ($match !~ /$regex/) {
    print "Matched as it should!\n";
}
if ($no_match !~ /$regex/) {
    print "You shouldn't see this!\n";
}

que da salida:

Matched as it should!

Básicamente, está indicando que para encontrar lo que no queremos, a continuación, invertir la verdad. Esperar que tiene sentido. Puede ayudarle a convertir el ejemplo a otro idioma si necesita ayuda.

Esto puede ser un buen comienzo para usted.

^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$

Vea en acción en regex101.com .

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