RegEx-golf: faire correspondre tous les contenus d'une chaîne


10

Votre tâche consiste à écrire un RegEx qui correspond à tout ce qui se trouve à l'intérieur des chaînes.

Une chaîne est définie comme tout ce qui est entouré (mais non compris) de deux non échappés ".

A "peut être échappé par \, qui peut également être échappé à nouveau.

Cas de test

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

Notation

La solution la plus courte l'emporte.

Spécifications

  • Veuillez préciser la saveur utilisée.
  • L'entrée sera équilibrée ".
  • Aucun élément ne \précédera immédiatement un délimiteur de début de chaîne. Par exemple, vous n'auriez pas besoin de gérerabc\"def"

1
Y aura-t-il \avant une chaîne? Par exemple abc\"def".
jimmy23013

Doit-il correspondre à chaque chaîne d'un groupe? Par exemple, pourrais-je écrire quelque chose qui a deux correspondances abc"de", l'une det l'autre e?
jimmy23013

C'est permis .
Leaky Nun

Y aura-t-il des chaînes vides?
Martin Ender

Oui, il y aura des chaînes vides.
Leaky Nun

Réponses:


3

PCRE, 21 20 15 19 octets

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

Essayez-le ici.

Cela correspond à un caractère (ou au début de l'entrée) avant le guillemet double de début, puis réinitialise la correspondance, pour vous assurer que le guillemet double n'est pas partagé avec une autre correspondance.

PCRE, 25 23 octets

Merci à Martin Büttner pour avoir joué au golf sur 2 octets.

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

Essayez-le ici.

Explication

(
    \\.|[^"]     # 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.

Notez que le quantificateur possessif ( *+) s'est assuré que l'anticipation négative commence toujours après une chaîne entière ou un segment entier de non-chaîne.

Il y a 4 cas:

  • La correspondance commence n'importe où en dehors d'une chaîne. \\.ne correspondrait jamais à une citation double selon la clarification. Il ne peut se terminer que juste avant le prochain guillemet double qui commence une chaîne ou la fin de l'entrée. Les deux cas échouent à l'anticipation négative.
  • La correspondance commence au début d'une chaîne. (\\.|[^"])*+correspondrait à une chaîne complète. Le caractère suivant doit être un guillemet double et ne peut pas être la fin de la saisie. Après la citation double, il est en dehors de la chaîne, il ne peut donc pas s'agir d'une autre correspondance. Il passe donc l'anticipation négative.
  • La correspondance commence à la fin d'une chaîne. Il correspond à une chaîne vide de la même manière que le cas précédent. Mais cela n'a pas d'importance selon la clarification.
  • La correspondance commence au milieu d'une chaîne. Impossible car les correspondances ne se chevauchent pas.

Ça (\\.|[^"])marcherait?
Martin Ender

@ MartinBüttner qui correspond à tout sauf "
Bálint

@ Bálint je voulais dire à la place de ([^\\"]|\\.), pas comme la solution complète.
Martin Ender

@ MartinBüttner Oh, ok
Bálint

La suggestion de Martin devrait fonctionner, car elle \\.échoue uniquement lorsqu'il n'y a pas de caractère après \(ou un nouveau caractère de ligne, mais cela peut être corrigé avec un indicateur), et ce cas est couvert par le regard négatif. Le quantificateur possessif empêche le retour en arrière, nous n'avons donc pas d'autre cas à examiner.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript, 24 octets

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

Le groupe 1 est le contenu de la chaîne.


Cela ne fonctionne pas du tout avec les guillemets échappés et ne répond donc pas aux spécifications.
ATaco

Ah oui - désolé. Et ça?
Whothehellisthat

Fermer mais pas de cigare, vous ne devriez pas faire correspondre le "s extérieur
ATaco

Oui, c'est ce dont j'avais peur. Pas moyen de le faire en JavaScript, je suppose?
Whothehellisthat

Vous pouvez le capturer dans un sous
ATaco

0

JavaScript, 21 15 13 12 octets

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

Le contenu des chaînes est dans le groupe 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.