ligne par ligne Regex: Comment faire correspondre des triples guillemets mais pas entre guillemets

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

  •  18-09-2019
  •  | 
  •  

Question

Je dois vérifier pour voir si une chaîne de plusieurs mots / lettres / etc, ne contient que 1 jeu de triples guillemets doubles (par exemple « » « ), mais peut aussi contenir des simples guillemets doubles ( ») et double double -quotes ( ""), en utilisant une expression régulière. Je n'ai pas eu beaucoup de succès à ce jour.

Était-ce utile?

La solution

Une expression rationnelle négative peut préanalyse faire:

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

Je l'ai essayé avec ces lignes de code 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 ) );

... avec sortie:

true
false

Autres conseils

Essayez d'utiliser le nombre d'occurrences opérateur pour correspondre exactement trois doubles guillemets.

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

Je l'ai rapidement vérifié à l'aide http://www.regextester.com/ , semble fonctionner très bien.

Comment vous compilez correctement le regex dans votre langue de choix peut varier, bien!

dépend de votre langue, mais vous ne devez besoin de faire correspondre trois doubles guillemets (par exemple, /\"{3}/), puis compter les matchs pour voir s'il y a exactement un.

Il y a probablement beaucoup de façons de le faire, mais simple est de regarder simplement pour de multiples occurrences de triples guillemets puis inverser l'expression régulière. Voici un exemple 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";
}

Quels sont sorties:

Matched as it should!

En gros, vous dites à trouver la chose que vous ne voulez pas, puis inverser la vérité. L'espoir qui fait sens. Pouvez-vous aider à convertir l'exemple dans une autre langue si vous avez besoin d'aide.

Cela peut être un bon point de départ pour vous.

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

voir en action à regex101.com .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top