2016-10-19 1 views
1

Désolé si cette question a déjà été résolue, ou fermée mais j'ai longtemps cherché sans réponse.Java regexp split lorsque le délimiteur fait partie des données

Je dois découper des lignes que je reçois d'un système externe, en utilisant le délimiteur ~.

J'ai un problème car certaines données contiennent ~~ (~ répété deux fois) et dans ce cas, les données ne doivent pas être divisées.

Donc, si je reçois A~B~C~~C~D Je veux cette division arrière: A, B, C~~C, D

Je ne peux pas comprendre ce que l'expression régulière, je dois ne pas pour diviser ~~.

+0

Quelle est votre regex actuelle? –

+1

Comme j'aime les cas de bord - ce qui devrait arriver à 'A ~ B ~~~ C' –

+0

mon regexp était juste" ~ ". A propos des cas de bords A ~ B ~~~ C n'arrivera jamais. Nous aurions A ~ B ~~ C à la place et devrait être divisé comme A, B ~~ C – Gilles

Répondre

0

Vous pouvez utiliser (?<!~)~(?!~) avec un look-ahead négatif et regarder en arrière pour ~.

Exemple

String test = "A~B~C~~D~E"; 
System.out.println(
    Arrays.toString(
     test.split("(?<!~)~(?!~)") 
    ) 
); 

sortie

[A, B, C~~D, E] 

Cela devrait également fonctionner avec plus de deux ~ consécutifs s, par exemple, avec "A~B~C~~~D~E".

+0

Celui-ci fonctionne. Merci beaucoup – Gilles

+0

@Gilles vous êtes les bienvenus. – Mena

2

Vous pouvez diviser par

\b~\b 

Voir la démo.

https://regex101.com/r/t3D2Jp/1

Vous pouvez utiliser

(?:^|\b)~(?:$|\b) 

si vous voulez supprimer les arrière trop

+1

Vous pourriez aussi vouloir obtenir le '' ',' ie 'b ~ a ~'. Dans ce cas vous pouvez écrire '(^ | \ b) ~ ($ | \ b)' – flakes

+0

@flkes thanx ajouté – vks

+0

Je pense que rendre les groupes non-capturés ici est redondant? – flakes