Regex Zeile für Zeile: Wie dreifache Anführungszeichen passen, aber nicht doppelte Anführungszeichen

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

  •  18-09-2019
  •  | 
  •  

Frage

Ich muss überprüfen, um zu sehen, ob eine Kette von vielen Wörtern / Buchstaben / etc, nur 1 Satz von Triple doppelte Anführungszeichen (zB „“ „) enthält, kann aber auch einzelne doppelte Anführungszeichen enthalten (“) und double double -quotes ( ""), einen regulären Ausdruck verwenden. Wurden bisher nicht viel Erfolg gehabt.

War es hilfreich?

Lösung

Ein regex mit negativem Look-Ahead kann es tun:

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

Ich habe versucht, es mit diesen Zeilen Java-Code:

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 ) );

... mit Ausgang:

true
false

Andere Tipps

Versuchen Sie, die Anzahl der Vorkommen Operator genau drei doppelte Anführungszeichen entsprechen.

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

Ich habe schnell geprüft mit http://www.regextester.com/ , scheint zu funktionieren in Ordnung.

Wie Sie richtig die Regex in der Sprache Ihrer Wahl zusammenstellen können variieren, aber!

Abhängig von Ihrer Sprache, aber Sie sollten nur für drei doppelte Anführungszeichen übereinstimmen müssen (zum Beispiel /\"{3}/) und dann die Spiele zu zählen, um zu sehen, ob es genau ist.

Es gibt wahrscheinlich viele Möglichkeiten, dies zu tun, aber ein einfaches ist lediglich für mehrere Vorkommen von dreifachen Anführungszeichen suchen dann den regulären Ausdruck invertieren. Hier ist ein Beispiel von 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";
}

Welche Ausgänge:

Matched as it should!

Grundsätzlich Sie sagen es, die Sache finden Sie nicht wollen, dann die Wahrheit zu invertieren. Hoffe, das macht Sinn. Können Sie helfen, das Beispiel in einer anderen Sprache zu konvertieren, wenn Sie Hilfe benötigen.

Dies kann ein guter Start für Sie sein.

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

In Aktion sieht unter regex101.com .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top