Regex et s'est échappé et sans échappement délimiteur
question relative à l' cette
J'ai une chaîne
a\;b\\;c;d
qui en Java ressemble
String s = "a\\;b\\\\;c;d"
J'ai besoin de le diviser par le point-virgule avec les règles suivantes:
-
Si le point-virgule est précédé d'une barre oblique inverse, il ne doit pas être traitée comme séparateur (entre un et b).
-
Si la barre oblique inverse est échappé et, par conséquent, n'échappe pas lui-même le point-virgule, point-virgule doit être de séparation (entre b et c).
Donc point-virgule doit être traitée comme séparateur si il est zéro ou un nombre de barres obliques avant.
Pour l'exemple ci-dessus, je veux recevoir les chaînes de caractères suivantes (double anti-slash pour compilateur java):
a\;b\\
c
d
Où est la double barre oblique inverse? Allé?
Je ne suis pas sûr que c'est une regex que vous voulez ici
Je suis également pas sûr si les expressions régulières sont le meilleur outil pour cette tâche. Mais vous avez choisi d'ignorer ma réponse ci-dessous; - /
Je ne suis pas sûr que c'est une regex que vous voulez ici
Je suis également pas sûr si les expressions régulières sont le meilleur outil pour cette tâche. Mais vous avez choisi d'ignorer ma réponse ci-dessous; - /
OriginalL'auteur lstipakov | 2011-10-26
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser les regex
pour correspondre à tout le texte entre sans échappement des points-virgules:
Explication:
Le possessif match (
++
) est important pour éviter le retour en arrière catastrophique en raison de la imbriquée quantificateurs.[a\;b\\, , c, , d, ]
. Est ce que c'est possible de la prévenir, à l'exception de la vérification de la valeur de retour de groupe()?Oui, avec un + à la place de *, vous débarrasser des chaînes vides
Étrange, il ne fait pas cela dans mes tests (en RegexBuddy, tout de même). Eh bien, si vous ne voulez pas vide correspond à, changer la
*
à+
, mais vous pourrez également ne pas avoir de "vrai" vide matches comme dansa;;b
.yep, véritable vide matchs sont très bien.
OriginalL'auteur Tim Pietzcker
Cela devrait fonctionner.
Explication :
Il vous suffit de le match, les points-virgules sont pas précédées par exactement un
\
.EDIT :
Cela va prendre soin de tout nombre impair de . Il bien sûr échouer si vous avez plus de 4000000 nombre de \. Explication de édité réponse :
a\\\;b;c
et d'autres cas, avec plus de deux barres obliques inverses.Il ne fonctionne pas avec un"\\; b\\\\\\;c;d"...
vérifier édité réponse 🙂
c'est le cas maintenant 🙂
Quelqu'un peut m'expliquer la downvoting? Sauf que je suis absent quelque chose d'évident?
OriginalL'auteur FailedDev
Je ne fais pas confiance à détecter les cas avec n'importe quel type d'expression régulière. J'ai l'habitude de faire une simple boucle pour de telles choses, je vais les dessiner à l'aide de
C
puisque c'est il y a longtemps j'ai touché en dernierJava
😉La avantages sont:
OriginalL'auteur hochl
Cette approche suppose que votre chaîne n'aura pas
char '\0'
dans votre chaîne. Si vous le faites, vous pouvez utiliser un autre char.OriginalL'auteur krico
C'est la vraie réponse, je pense.
Dans mon cas, je suis en train de séparer à l'aide de
|
et le caractère d'échappement est&
.Dans ce code, je suis en utilisant Lookbehind pour échapper & personnage.
à noter que le coup d'oeil derrière doit avoir un maximum de longueur.
cela signifie tout
|
à l'exception de ceux qui sont les suivantes((?:[^&]|^)(&&){0,10000}&))
et cette partie signifie n'importe quel nombre impair de&
s.la partie
(?:[^&]|^)
est important de s'assurer que vous êtes en comptant toutes les&
s derrière le|
au début ou à d'autres personnages.OriginalL'auteur Rasoul