Instrregex : la fonction instr utilisant les expressions regulieres

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 864 fois - Téléchargée 28 fois

Contenu du snippet

Le Framework.net ajoute un support avancé des Expressions Regulieres (Regex), vous pouvez voir comment elles fonctionnent et voir leur utilisation ici : http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpguide/html/cpconregularexpressionexamples.asp

Cette fonction fonctionne de la meme maniere que Instr, elle vous renvoit la position d'un mot dans une chaine, si le mot n'est pas dans cette chaine, elle revoit zéro, et si la regex passée en argument n'est pas valide, elle renvoit -1.

L'interret supplementaire de la chose ? La puissance des Regex ! C'est language presque a part entiere, qui permet des choses assez impressionantes.
Regardez l'exemple que je donne a la fin

Source / Exemple :


Public Function InStrRegex(ByVal String1 As String, ByVal StrRegex As String, Optional ByVal RegexOptions As System.Text.RegularExpressions.RegexOptions = System.Text.RegularExpressions.RegexOptions.None) As Integer
        Try
            Dim Regex As New System.Text.RegularExpressions.Regex(StrRegex, RegexOptions)
            Return Regex.Match(String1).Index
        Catch ex As Exception
            Return -1
        End Try
    End Function

    Public Function InStrRegex(ByVal Start As Integer, ByVal String1 As String, ByVal StrRegex As String, Optional ByVal RegexOptions As System.Text.RegularExpressions.RegexOptions = System.Text.RegularExpressions.RegexOptions.None) As Integer
        Try
            Dim Regex As New System.Text.RegularExpressions.Regex(StrRegex, RegexOptions)
            Return Regex.Match(String1, Start).Index
        Catch ex As Exception
            Return -1
        End Try
    End Function

Conclusion :


Exemple :

Verifier si une string contient une adresse mail :

MsgBox(InStrRegex("PLOP@PLOPY.Net","^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"))

Renvoit 1

A voir également

Ajouter un commentaire

Commentaires

blq
Messages postés
97
Date d'inscription
vendredi 22 octobre 1999
Statut
Membre
Dernière intervention
13 juin 2016
1
Impeccable !

Puisque l'écriture du code peut avoir de l'importance pour l'apprentissage, une autre forme, pour éviter d'ajouter des -1 à tous les "niveaux", il suffit d'effectuer l'initialisation par défaut dés le début de la fonction :

''' -----------------------------------------------------------------------------
''' <summary>
''' Cette fonction est identique à Instr, elle renvoit la position d'un mot dans
''' une chaine à partir d'une position, si le mot n'est pas dans cette chaine,
''' elle renvoit zéro, et si la regex passée en argument n'est pas valide,
''' elle renvoit -1.
''' </summary>
''' Integer

''' String

''' String

''' RegexOptions.None

''' <returns>Integer</returns>
''' <remarks>
''' Exemple pour verifier si un String contient une adresse mail :
''' InStrRegex("PLOP@PLOPY.Net",
''' "^([\w-\.]+) @((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-] +\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")
''' Renvoi 1
''' </remarks>
''' -----------------------------------------------------------------------------
Public Function InStrRegex(ByVal Start As Integer, ByVal targetContent As String, ByVal StrRegex As String, _
Optional ByVal RegexOptions As RegexOptions = RegexOptions.None) As Integer
InStrRegex = -1

Try
Dim Regex As New Regex(StrRegex, RegexOptions)

If Regex.IsMatch(targetContent, Start) Then
Return Regex.Match(targetContent, Start).Index
End If

Catch Err As Exception
Call MsgBox("Unable to find string from regex: " & Start & " - " & targetContent & VbCrlf & Err.Message)

End Try
End Function

Avec les commentaires en entête de fonction pour faire plus "beau"
jjmaster
Messages postés
51
Date d'inscription
mardi 28 janvier 2003
Statut
Membre
Dernière intervention
29 septembre 2010

merci Xya pour ton intervention car l'exemple de depart n'etait tres explicite.

Bon courage @tous
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
tu pourrais commenter un peu ton exemple :

MsgBox(InStrRegex("PLOP@PLOPY.Net","^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"))

ca me semble plus long que ca devrai...
cs_leka
Messages postés
19
Date d'inscription
jeudi 27 mars 2003
Statut
Membre
Dernière intervention
17 juin 2004

Oui merci de me l'avoir signalé, j'ai corrigé apres dans mon prog, mais j'ai pas repensé a updater ici, l'autre truc avec le probleme de longueur des espaces de noms, c'est que c'est a la personne qui utilise le code de penser a l'importer, moi je fournis quelque chose d'utilisable tel quel. Pour importer les espaces de noms c'est plus compliqué... Faut un module ou une classe, et donc c'est pas pratique a poster quoi...
Xya
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

J'aurais deux conseils pour améliorer un chouia ton code:

D'abord pour améliorer la lisibilité du code importer l'espace de noms System.Text.RegularExpressions.
Ensuite pour éviter d'avoir à gérer les exceptions levées si le texte ne contient pas l'expression (Match renvoie Nothing et une exception NullReferenceException est levée), utiliser Regex.IsMatch.

Ce qui donnerait le code:

Imports System.Text.RegularExpressions

Public Function InStrRegex(ByVal String1 As String, ByVal StrRegex As String, Optional ByVal RegexOptions As RegexOptions = .RegexOptions.None) As Integer
Try
Dim Regex As New Regex(StrRegex, RegexOptions)
If Regex.IsMatch(String1) Then
Return Regex.Match(String1).Index
Else
Return -1
End if
Catch ex As Exception
Return -1
End Try
End Function

Public Function InStrRegex(ByVal Start As Integer, ByVal String1 As String, ByVal StrRegex As String, Optional ByVal RegexOptions As RegexOptions = RegexOptions.None) As Integer
Try
Dim Regex As New Regex(StrRegex, RegexOptions)
If Regex.IsMatch(String1, Start) Then
Return Regex.Match(String1, Start).Index
Else
Return -1
End if
Catch ex As Exception
Return -1
End Try
End Function

Attention aussi dans .NET tous les index sont de base zéro et donc si l'expression régulière est trouvée au tout début du texte (à partir du 1er caractère) Index renvoie 0.

Xya

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.