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:
3 Réponses :
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 .
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
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")
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 #
Je suppose que cette expression,
(?:\/blobs\/)|(.*?)
serait peut-être une option pour commencer.
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
Si vous ne correspondez pas au
/après/ blobsdans 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" ) code> 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