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.