Domanda

ho bisogno di controllare per vedere se una stringa di molte parole / lettere / etc, contiene solo 1 set di virgolette doppie triple (vale a dire "" "), ma può anche contenere virgolette singole (") e doppia doppia -quotes ( ""), utilizzando un'espressione regolare. Non hanno avuto molto successo finora.

È stato utile?

Soluzione

Un'espressione regolare con lookahead negativo può farlo:

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

ho provato con queste righe di codice 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 uscita:

true
false

Altri suggerimenti

Provare a utilizzare il numero di occorrenze dell'operatore in modo che corrisponda esattamente tre virgolette.

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

Ho subito controllato utilizzando http://www.regextester.com/ , sembra funzionare multa.

Come si compila correttamente l'espressione regolare nella lingua di propria scelta può variare, però!

dipende dalla vostra lingua, ma si dovrebbe solo bisogno di corrispondere per tre virgolette doppie (ad esempio, /\"{3}/) e poi contare le partite per vedere se c'è esattamente un.

Probabilmente ci sono un sacco di modi per farlo, ma un semplice è quello di guardare solo per più occorrenze di citazioni triple poi invertire l'espressione regolare. Ecco un esempio da 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";
}

Quali uscite:

Matched as it should!

In sostanza, si indica che per trovare la cosa che non si vuole, quindi invertendo la verità. Spero che abbia un senso. Può aiutare a convertire l'esempio in un'altra lingua, se hai bisogno di aiuto.

Questo potrebbe essere un buon inizio per voi.

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

Guardalo in azione a regex101.com .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top