J'essaye de remplacer le premier "|" mais en commençant par la fin de la chaîne:
String strLine = "usr/bin/pipe|pipe|name|28|-rwxr-xr-x|root:root||46711b361edd4512814d9b367ae765f42a71d729708b3f2e162acb8f64592610|";
strLine = strLine.replaceAll(".([^\\|]*)$", "[:124:]");
System.out.println("strLine : " + strLine);
mon nom de fichier est pipe | pipe | name et je veux que mon regex me renvoie usr / bin / pipe | pipe | name
J'ai commencé par cette expression régulière: . ([^ \ |] *) $ mais je ne sais pas comment pour aller plus loin dans les tuyaux: https://regex101.com/r/ttbiab/3
Et en Java:
usr/bin/pipe|pipe|name|28|-rwxr-xr-x|root:root||46711b361edd4512814d9b367ae765f42a71d729708b3f2e162acb8f64592610|
3 Réponses :
Vous pouvez essayer quelque chose comme ceci [\ |] ([^ \ |] * [\ |]) {5} $ . Il correspond au nombre de tuyaux de 5 suivi du premier tuyau à partir des extrémités.
S'il y a un nombre fixe de 6 tubes jusqu'à la fin de la chaîne, et que vous voulez sélectionner les tubes individuels avant cela pour les remplacer, vous pouvez utiliser \ G pour affirmer le positionnez-vous à la correspondance précédente et utilisez une anticipation pour affirmer que ce qui est à droite n'est pas 6 fois un tube suivi d'un tube.
$1#$2
En Java:
String regex = "(?:([^\\|]*)|\\G(?!^))\\|([^|]*)(?=(?:[^|]*\\|){6})";
(?: Groupe sans capture
([^ \ |] *) Capturez dans le groupe 1 ne correspondant pas à un tube 0+ fois en utilisant un classe de caractères annulée | OU \ G (?! ^) Affirmer la position à la fin de la correspondance précédente, pas au début ) Fermer le groupe non capturant \ | ([^ |] *) Faire correspondre un tube et capturer dans le groupe 2 correspond 0+ fois pas un tube (? = Groupe sans capture
(?: [^ |] * \ |) {6} Recherche positive, affirmer que ce qui est à droite n'est pas 6 fois un tube suivi d'un tube ) Fermer le groupe non capturant Si vous souhaitez remplacer le tube par par exemple # , puis utilisez les 2 groupes de capture:
(?:([^\|]*)|\G(?!^))\|([^|]*)(?=(?:[^|]*\|){6})
D'après vos commentaires, il semble que vous ne savez pas combien de tubes il y aura dans le nom de fichier, mais vous savez combien de tubes il y a dans la chaîne d'entrée qui ne sont pas ' t dans le nom du fichier. Dans ce cas, l'expression régulière n'est peut-être pas la meilleure approche. Il y a plusieurs façons de le faire, mais peut-être l'une des plus simples à comprendre et à maintenir serait de diviser la chaîne, puis de la recombiner avec des remplacements le cas échéant:
String input = "usr/bin/pipe|pipe|name|28|-rwxr-xr-x|root:root||46711b361edd4512814d9b367ae765f42a71d729708b3f2e162acb8f64592610|";
String pipeReplacement = ":124:";
int numberOfPipesToKeep = 7;
String[] split = input.split("\\|");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < split.length; i++) {
sb.append(split[i]);
if (i < split.length - numberOfPipesToKeep) {
sb.append(pipeReplacement);
} else {
sb.append("|");
}
}
String output = sb.toString();
System.out.println(output);
Ce qui précède sample gère n'importe quel nombre de tubes, est assez configurable et est (à mon avis) beaucoup plus facile à comprendre et à déboguer que d'essayer d'utiliser des expressions régulières.
Doublon possible de Remplacer la dernière partie de la chaîne
Pouvez-vous donner des exemples? Je ne sais pas si vous voulez dire le premier tuyau de la chaîne ou le dernier tuyau.
Quelle commande génère la chaîne que vous essayez d'analyser? Sur la base de ce que vous avez montré, un nom de fichier peut théoriquement ne contenir aucun tube, un tube ou plusieurs tubes, vous devrez donc utiliser autre chose que les tubes sur lesquels baser votre regex.
Je veux gérer des fichiers avec des tubes;) c'est un agent de scan qui me génère un fichier avec tous les packages que j'ai installés sur une machine Linux
Voulez-vous dire comme ça? regex101.com/r/i4Mttp/1
Votre nom de fichier est-il toujours garanti de contenir un tube? Pourrait-il avoir plusieurs tuyaux?
@Thefourthbird votre exemple ne fonctionne que pour 1 tube et en java semble compliqué à gérer pour le remplacement
Voulez-vous remplacer un tuyau ou voulez-vous obtenir une correspondance?
remplace tous les tuyaux de mon nom de fichier
Il n'est pas garanti d'avoir un tuyau, j'en ai juste quelques-uns qui l'ont et il pourrait avoir plusieurs tuyaux oui mais mon nombre de tuyaux après le nom de fichier est fixé à 6