2012-07-30 6 views
3

Je cherche un moyen de rechercher et de remplacer les mots entiers seulement. Puisque les mots entiers dans mon cas peuvent être séparés non seulement par un espace mais.,;: /? etc. Je ne peux pas penser à un moyen efficace de coder ceci.Rechercher et remplacer MOTS ENTIER SEULEMENT

Fondamentalement, je cherche à faire quelque chose comme ça

replace([address], ***--list of separators, like .,;:/?--*** & [replacewhat] & ***--list of separators, like .,;:/?--*** ," " & [replacewith] & " ") 

Je ne sais pas comment passer une liste de séparateurs à la fois en cours d'exécution à la place une fonction Replace une fois pour chaque combinaison de séparateurs (qui combinés avec 300 mots que je remplace serait un nombre fou de requêtes)

+0

Le problème est que vous ne pouvez pas définir les règles sous lesquelles cela fonctionnerait. Il y a trop de variations/permutations. En conséquence, aucun ensemble de logique ne peut le faire correctement. Le mieux que vous pouvez espérer est un processus qui signalerait ceux qui ont besoin d'un examen humain; vérifiez ceux que vous voulez mettre à jour, puis laissez le système se mettre à jour après l'examen manuel. Sinon, vous allez développer une IA pour gérer les permutations. – xQbert

+2

ce n'est pas vraiment vrai, tout d'abord, MS le fait déjà (vous pouvez rechercher des mots entiers) et deuxièmement, je peux arriver à une liste de combinaisons et ensuite exécuter chacun de mes 300 mots avec chaque ensemble. J'essaie vraiment d'éviter cela mais c'est 100% possible. Une autre chose que je peux faire est d'exécuter un remplacement qui remplacera tous les caractères avec un espace et ensuite remplacer mes 300 mots s'ils sont entourés d'espaces. donc il y a des façons de le faire, j'essaie juste de trouver la meilleure façon de le faire. Je dois croire qu'il existe des moyens de rechercher des mots entiers. Je vous remercie!! – lalachka

+0

J'ai déjà un code qui me donnera toutes les permutations de 2 de n'importe quel nombre de moins de 9. J'essaie juste vraiment d'éviter de passer par là. – lalachka

Répondre

12

Vous pouvez faire un remplacement avec une expression régulière en utilisant un modèle avec le marqueur \b (pour la limite de mot) avant et après le mot que vous voulez remplacer.

Public Function RegExpReplaceWord(ByVal strSource As String, _ 
    ByVal strFind As String, _ 
    ByVal strReplace As String) As String 
' Purpose : replace [strFind] with [strReplace] in [strSource] 
' Comment : [strFind] can be plain text or a regexp pattern; 
'    all occurences of [strFind] are replaced 
    ' early binding requires reference to Microsoft VBScript 
    ' Regular Expressions: 
    'Dim re As RegExp 
    'Set re = New RegExp 
    ' with late binding, no reference needed: 
    Dim re As Object 
    Set re = CreateObject("VBScript.RegExp") 

    re.Global = True 
    're.IgnoreCase = True ' <-- case insensitve 
    re.pattern = "\b" & strFind & "\b" 
    RegExpReplaceWord = re.Replace(strSource, strReplace) 
    Set re = Nothing 
End Function 

Comme écrit, la recherche est sensible à la casse. Si vous voulez insensible à la casse, activez cette ligne:

re.IgnoreCase = True 

Dans la fenêtre immédiate ...

? RegExpReplaceWord("one too three", "too", "two") 
one two three 
? RegExpReplaceWord("one tool three", "too", "two") 
one tool three 
? RegExpReplaceWord("one too() three", "too", "two") 
one two() three 
? RegExpReplaceWord("one too three", "to", "two") 
one too three 
? RegExpReplaceWord("one too three", "t..", "two") 
one two three 

... et pour votre gamme de délimiteurs ...

? RegExpReplaceWord("one.too.three", "too", "two") 
one.two.three 
? RegExpReplaceWord("one,too,three", "too", "two") 
one,two,three 
? RegExpReplaceWord("one;too;three", "too", "two") 
one;two;three 
? RegExpReplaceWord("one:too:three", "too", "two") 
one:two:three 
? RegExpReplaceWord("one/too/three", "too", "two") 
one/two/three 
? RegExpReplaceWord("one?too?three", "too", "two") 
one?two?three 
? RegExpReplaceWord("one--too--three", "too", "two") 
one--two--three 
? RegExpReplaceWord("one***too***three", "too", "two") 
one***two***three 
+0

Est-ce que je fais quelque chose de mal? J'utilise ceci dans une requête Expr2: RegExpReplaceWord ([newaddress1], "st", "street") et il ne remplace pas. NewAddress1 \t Expr2 1 COLUMBIA ST 1 COLUMBIA ST – lalachka

+0

ohh, c'est sensible à la casse, pas de problème, c'est si élégant !!))))))) – lalachka

+0

ok, je m'excuse, je suis nouveau sur ce site et ne le font pas savoir comment les choses fonctionnent encore. vos deux solutions sont des réponses mais j'ai essayé de marquer la vôtre comme une réponse et ça l'a enlevé à Remou. Je voudrais vous donner tous les deux crédit, comment est-ce fait? Je vous ai déjà fait 1-up, est-ce suffisant? PS Oh, salut HansUp))))) je me souviens de vous de ShellAndWait et de votre clause WTF))))))) encore merci – lalachka