RegEx-golf: trova tutti i contenuti in una stringa


10

Il tuo compito è scrivere un RegEx che corrisponda a tutto ciò che è contenuto nelle stringhe.

Una stringa è definita come tutto circondato da (ma non incluso) due senza caratteri di escape ".

A "può essere evitato da \, che può anche essere evaso di nuovo.

Casi test

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

punteggio

Vince la soluzione più breve.

Specifiche

  • Si prega di specificare l'aroma utilizzato.
  • L'ingresso sarà bilanciato ".
  • Non ci sarà nessuno \che precede immediatamente un delimitatore di inizio stringa. Ad esempio, non dovresti gestirloabc\"def"

1
Ci sarà \prima di una stringa? Per esempio abc\"def".
jimmy23013,

Deve corrispondere a ciascuna stringa in un gruppo? Ad esempio, posso scrivere qualcosa con due corrispondenze abc"de", una è de l'altra è e?
jimmy23013,

È permesso .
Leaky Nun,

Ci saranno stringhe vuote?
Martin Ender,

Sì, ci saranno stringhe vuote.
Leaky Nun,

Risposte:


3

PCRE, 21 20 15 19 byte

(.|^)"\K(\\.|[^"])*

Provalo qui.

Questo corrisponde a un carattere (o all'inizio dell'input) prima della doppia virgoletta iniziale e quindi reimposta la corrispondenza, per assicurarsi che la doppia virgoletta non sia condivisa con un'altra corrispondenza.

PCRE, 25 23 byte

Grazie a Martin Büttner per il golf off 2 byte.

(\\.|[^"])*+(?!"(?R)|$)

Provalo qui.

Spiegazione

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Si noti che il quantificatore possessivo ( *+) si è assicurato che il lookahead negativo inizi sempre dopo un'intera stringa o un intero segmento di non stringa.

Ci sono 4 casi:

  • La partita inizia ovunque al di fuori di una stringa. \\.non corrisponderebbe mai a una doppia citazione secondo il chiarimento. Potrebbe terminare solo poco prima della prossima virgoletta doppia che inizia una stringa o la fine dell'input. Entrambi i casi falliscono il lookahead negativo.
  • La partita inizia all'inizio di una stringa. (\\.|[^"])*+corrisponderebbe a una stringa completa. Il personaggio successivo deve essere una doppia citazione e non potrebbe essere la fine dell'input. Dopo la doppia virgoletta è al di fuori della stringa, quindi non potrebbe essere un'altra corrispondenza. Quindi passa lo sguardo negativo.
  • La partita inizia alla fine di una stringa. Corrisponde a una stringa vuota allo stesso modo del caso precedente. Ma non importa secondo il chiarimento.
  • La partita inizia nel mezzo di una stringa. Impossibile perché le partite non si sovrappongono.

Funzionerebbe (\\.|[^"])?
Martin Ender,

@ MartinBüttner che corrisponde a tutto tranne che a "
Bálint,

@ Bálint intendevo al posto di ([^\\"]|\\.), non come la soluzione completa.
Martin Ender,

@ MartinBüttner Oh, ok
Bálint,

Il suggerimento di Martin dovrebbe funzionare, dal momento \\.che fallisce solo quando non ci sono caratteri dopo \(o carattere di nuova linea, ma che può essere risolto con la bandiera), e quel caso è coperto dallo sguardo negativo. Il quantificatore possessivo impedisce il backtracking, quindi non abbiamo altro caso da guardare.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript, 24 byte

"([^"\\]*(?:\\.[^"\\]*)*)"

Il gruppo 1 è il contenuto della stringa.


Questo non funziona affatto con le virgolette sfuggite e quindi non soddisfa le specifiche.
ATaco,

Ah sì - scusa. Che ne dici di quello?
Whothehellisthat

Chiudi ma niente sigaro, non dovresti abbinare l'esterno "s
ATaco

Sì, questo è quello di cui avevo paura. Non c'è modo di farlo in JavaScript, immagino?
Whothehellisthat

Puoi catturarlo in un sottogruppo
ATaco,

0

JavaScript, 21 15 13 12 byte

"((\\?.)*?)"

I contenuti delle stringhe sono nel gruppo 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.