Pergunta

Eu preciso verificar para ver se uma seqüência de muitas palavras / letras / etc, contém apenas 1 conjunto de triplos aspas (ie "" "), mas também pode conter aspas simples (") e double double -quotes ( ""), usando uma regex. Não tiveram muito sucesso até agora.

Foi útil?

Solução

A regex com lookahead negativo pode fazê-lo:

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

Eu tentei com estas linhas 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 ) );

... com saída:

true
false

Outras dicas

Tente usar o número de ocorrências do operador para corresponder exatamente três aspas.

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

Eu rapidamente verificado usando http://www.regextester.com/ , parece funcionar bem.

Como você compilar corretamente o regex no idioma de sua escolha pode variar, embora!

depende do seu idioma, mas você só deve coincidir com três aspas (por exemplo, /\"{3}/) e depois contar os jogos para ver se há exatamente um.

Existem provavelmente muitas maneiras de fazer isso, mas um simples é meramente olhar para várias ocorrências de aspas triplas então invertido a expressão regular. Aqui está um exemplo 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 resultados:

Matched as it should!

Basicamente, você está dizendo a ele para encontrar a coisa que você NÃO quer, em seguida, invertendo a verdade. Esperança que faz sentido. Pode ajudá-lo a converter o exemplo para outro idioma se precisar de ajuda.

Este pode ser um bom começo para você.

^(\"([^\"\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])*\"\"\")$

Veja-o em acção em regex101.com .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top