linha Regex por linha: Como coincidir com aspas triplas, mas aspas não duplas
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.
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 .