INSTRREGEX : LA FONCTION INSTR UTILISANT LES EXPRESSIONS REGULIERES

Signaler
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005
-
blq
Messages postés
97
Date d'inscription
vendredi 22 octobre 1999
Statut
Membre
Dernière intervention
13 juin 2016
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23408-instrregex-la-fonction-instr-utilisant-les-expressions-regulieres

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
61
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