2016-12-30 2 views
0

Je me demandais s'il était possible d'ajouter un caractère (à utiliser ultérieurement comme délimiteur) à chaque occurrence d'une correspondance regex dans une chaîne. Je suis en train d'analyser du texte pour une chaîne entre <>, et j'ai un motif regex fonctionnel - bien que cela réduise chaque instance de la correspondance. Ce que je voudrais faire est d'ajouter chaque instance d'une correspondance à un, de sorte que je puisse appeler la méthode .split (',') plus tard et avoir une collection de chaîne que je peux boucler.Ajouter un caractère après chaque occurrence d'une correspondance regex dans PowerShell

$testString = "<[email protected]><[email protected]>" 
$testpattern = [regex]::Match($testString, '(?<=<)(.*)(?=>)').Value 

$ Testpattern sera désormais "bla @ gmail.combblah1 @ gmail.com"

Ce que je voudrais ajouter est un séparateur entre chaque instance du match, d'appeler le .split () méthode pour travailler avec une collection après le fait.

+0

'$ testString -replace '<([^<>] *)>', '$ 1;'' –

+0

Salut Mathias, je vous remercie pour la réponse - et ce modèle ne fonctionne ... Mais ce que je dois faire est match et ajouter en ligne. Le problème que j'ai est que quand je fais correspondre un modèle pour les adresses e-mail, toutes les adresses sont concaténées sans un délimiteur que je peux utiliser pour poursuivre l'analyse. –

Répondre

0

Je sais que ce n'est pas la seule façon de gérer le problème ci-dessus, et certainement pas le plus efficace - mais j'ai fini par faire ce qui suit. Donc pour reformuler la question, j'ai besoin d'analyser les en-têtes (à la ligne), pour toutes les adresses smtp (valeur entre '<' et '>'), et stocker toutes les adresses dans une collection après le fait.

 $EMLToCol = @() 

     $parseMe = $CDOMessage.to 
     # select just '<emailAddress>' 
     $parsed = Select-String -Pattern '(<.*?>)+' -InputObject $parseMe -AllMatches | ForEach-Object { $_.matches } 
     # remove this guy '<', and this guy '>' 
     $parsed = $parsed.Value | ForEach-Object {$_ -replace '<' -replace '>'} 
     # add to EMLToCol array 
     $parsed | ForEach-Object {$EMLToCol += $_} 
0

$testpattern est [email protected]><[email protected]

Vous devez utiliser <(.*)><(.*)> pour garder les deux adresse e-mail puis concaténer les deux chaînes: $testpattern = $testpattern[0] + "your string you want inbetween" + $testpattern[1]

Je ne sais pas 0 et 1, dépend de la langue.

Un autre point, soyez prudent, s'il y a des espaces ou des caractères non valides pour l'email, il les capturera toujours. vous devriez utiliser quelque chose comme <([a-zA-Z0-9\[email protected]\._]*\@[a-zA-Z0-9-]*\.[a-z-A-Z]*)><([a-zA-Z0-9\[email protected]\._]*\@[a-zA-Z0-9-]*\.[a-z-A-Z]*)>