-
preg_match_all en vb.net
J'ai un souci de ré-écriture d'une expression régulière avec la fonction preg_match_all de PHP en VB.net.
J'ai le texte suivant :
Un homme est toujours {amené|{acheminer|aller|{diriger|marcher}|envoyer}|cheminer} à faire des choix dans sa vie .
Avec le code suivant en PHP :
Code:
preg_match_all('/\{([^{}]*)\}/si', $mytext, $matches)
je retrouve tous les mots contenus dans les accolades (amené, acheminer, aller, diriger, marcher, envoyer, cheminer).
J'ai essayé de réécrire cette fonction en vb.net de la manière suivante :
Code:
Dim matches As System.Text.RegularExpressions.MatchCollection = System.Text.RegularExpressions.Regex.Matches(mytext, "\{([^{}]*)\}", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Mais cela ne me retourne que la chaine de texte {diriger|marcher} avec testmatches.Count = 1
Ou est l'erreur ?
Merci de votre aide.
-
Je ne sais pas ce que tu peux avoir comme entrée, mais si les séparateurs sont toujours { } ou | tu peux essayer avec [^{}|]+
-
Oui les séparateurs sont toujours { } ou |
Si je t'ai bien compris, le code devient alors :
Code:
Dim matches As System.Text.RegularExpressions.MatchCollection = System.Text.RegularExpressions.Regex.Matches(mytext, ""\{([^{}|]+)\}", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
C'est bien cela ?
-
Non, juste
Code:
Dim matches As MatchCollection = Regex.Matches(mytext, "[^{}|]+", RegexOptions.IgnoreCase)
-
StormimOn, presque bon :)
En effet avec cette nouvelle expression régulières désormais je trouve trop de résultats. :?
Cela me retourne
Un homme est toujours
amené
acheminer
aller
dirige
marcher
envoyer
cheminer
à faire des choix dans sa vie
Je ne veux que ce qui est entre les { .... } (ce que j'ai indiqué en bleu)
-
Essaye avec (?<=[{|])[^{}|]+(?=[}|]), ça devrait être mieux.
-
Alors là je dis respect :ccool:
Marche du tonnerre. Bravo :mrgreen: car cette expression régulière n'est pas piqué des hannetons ! J'ai chopé un superbe mal de tête à la décrypter :lol:
Merci de ton aide.
-
StormimOn, je profite de ton expertise sur le sujet :ccool:
Voilà la phrase que je veux analyser :
{ Parmi les | Un des | Dans les} { grands | petits | super } { atouts | avantages } navigateurs WEB, ....
Avec ta dernière expression régulières nous obtenons un tableau avec le résultat suivant :
[0]=> Parmi les
[1]=> Un des
[2]=> Dans les
[3]=> grands
[4]=> petits
[5]=> super
[6]=> atouts
[7]=> avantages
Comment faudrait il modifier cette expression pour obtenir le résultat suivant :
[0]=> Parmi les | Un des | Dans les
[1]=> grands | petits | super
[2]=> atouts | avantages
Merci de ton aide.
-
L'expression doit permettre de gérer les deux cas de figure ?
-
Non mais l'expression doit pouvoir gérer plusieurs niveaux de {} comme dans le cas 1).
En reprenant mon exemple :
{Parmi les|{Un des|{Tous les|Les}}|Dans les} {grands|petits|super} {atouts|avantages} navigateurs WEB, ....
j'obtiens
[0]=> Parmi les|Un des|Tous les|Les|Dans les
[1]=> grands|petits|super
[2]=> atouts|avantages
-
Pour ça je pense que si tu utilises les balancing groups ça doit passer.
Essaye avec l'expression {(?>[^{}]+|{(?<P>)|(?<C-P>)})*(?(P)(?!))}
Tu devrais avoir comme résultats :
{Parmi les|{Un des|{Tous les|Les}}|Dans les}
{grands|petits|super}
{atouts|avantages}
Après il suffit de supprimer les accolades et le tour est joué ;)
-
Merci.
On en apprend tous les jours :roll: car je ne connaissais pas la notion des balancing groups.