1
votes

extraction de deux sous-chaînes différentes à l'intérieur d'une chaîne

En utilisant une expression régulière, comment extraire plusieurs sous-chaînes à l'intérieur d'une chaîne?

Supposons que nous ayons ceci:

resgrp / fournisseurs / Microsoft.Storage / storageAccounts / vvvvvdgdevstor "," subject ":" / blobServices / default / containers / coloradohhhhready / blobs / README _.._. hl7 "," eventType ":" Microsoft.Storage.BlobCreated "," eventTime ":" 2019-06-19T17: 28: 40.3136657Z "," id ":" 604ad6c5a0145-04c4-26bsssss26a "," data ": {" api ":" PutBlockList "," clientRequestId ":" aaaaaaae -4e68-95f6-c1ssssb02f "

Le résultat que je voudrais est:

(?i)(?<=\/containers\/)(.*)(?=\/blobs\/)(.*)(?<=\/blobs\/)(.*)(?=","eventtype)

Ce que j'ai essayé est:

/coloradohhhhready/README_.._.hl7

Ce qui a donné:

coloradohhhhready / blobs / README _.._. hl7

Je voudrais simplement supprimer le segment / blobs / à l'intérieur de cette chaîne:

 entrez la description de l'image ici


5 commentaires

Si vous ne correspondez pas au / après / blobs dans votre modèle, vous pouvez utiliser le premier et le troisième groupe de capture (? I) (? <= \ /containers\/)(.*)(?=\/blobs)(.*)(?<=\/blobs)(.*)(?‌ = "," eventtype) Vous pourriez peut-être mettre à jour votre modèle à (? i) (? <= \ / containers) (/ [^ /] +) / blobs (/ [^ "/] +) (? =", "eventtype" ‌) et utilisez le groupe 1 et le groupe 2.


Il suffit de le post-traiter: match = match.Replace ("/ blobs /", "/") . Quoi qu'il en soit, vous ne pouvez pas faire correspondre du texte discontinu dans une opération de correspondance dans un seul groupe. Les Lookarounds ne sont pas destinés à «faire des trous» dans les textes que vous avez écrits.


@ WiktorStribiżew n'est-ce pas possible de le faire avec une regex pure?


Je pense que cela ressort clairement de mon commentaire.


à partir de votre commentaire De toute façon, vous ne pouvez pas faire correspondre du texte discontinu dans une opération de correspondance dans un seul groupe. Les Lookarounds ne sont pas destinés à "faire des trous" dans les textes que vous utilisez. vous dites que ce n'est tout simplement pas possible de faire avec regex. ai-je bien compris? Merci beaucoup


3 Réponses :


2
votes

Si vous savez que vous voudrez toujours supprimer / blobs / , remplacez simplement le tout après par un / .

En revanche, coller votre solution sur Regex101 a montré que la correspondance de votre epxression donne 3 groupes, dont l'un est / blobs / . Ainsi, dans votre cas, ce serait aussi simple que de reconstruire une autre chaîne en faisant: "/" + Group [1] .Value + "/" + Group [3] .Value .


3 commentaires

un autre mot que vous dites que ce n'est pas possible de faire avec pure regex?


Je suis intéressé par une solution purement regex


la raison pour laquelle il y avait une balise .net était parce que je voulais m'assurer que l'expression régulière était conforme .net, mais comme cela était déroutant, j'ai supprimé la balise .net



2
votes

Si vous voulez le faire correspondre en utilisant une regex, vous pouvez utiliser 2 groupes de capture et faire correspondre au lieu d'utiliser des lookarounds ce qui vient avant, après et / blobs au milieu.

Dans le groupe de capture (/ [^ /] +) , faites correspondre une barre oblique suivie de ne pas correspondre à /

Vos valeurs sont dans capture du groupe 1 et du groupe 2.

(?i)(?:/containers)(/[^/]+)/blobs(/[^"/]+)(?:","eventtype")

Regex démo | Exemple .NET C #


2 commentaires

la correspondance complète renvoie des chaînes / containers / et / blobs / indésirables: drive.google.com/uc?id=1aMlln70rbrKY4cBHtPY1m6kwvuxQcScy


merci je vois que, cependant ce n'est pas une solution purement regex Console.WriteLine (m.Groups [1] .Value + m.Groups [2] .Value); je ne veux pas impliquer de autre code en plus de regex, pas de c #



0
votes

Je suppose que cette expression,

(?:\/blobs\/)|(.*?)

serait peut-être une option pour commencer.

Démo


2 commentaires

merci encore pour votre aide, emma, un autre mot que ce n'est pas possible de faire avec une expression régulière pure?


c'est une solution vraiment cool, cependant, il semble qu'elle capture tout sauf pour / blobs drive.google.com/uc?id=15mxMKImot48Lj-e_o4wxJSqaKXkVTjLS