2015-08-06 1 views
1

J'ai une question relativement simple mais qui m'a amené au mur. Je veux avoir une tâche suivante de regex dans VBA (VBScript_RegExp_5.5).Extraire la sous-chaîne spécifique qui ne précédait pas avec la sous-chaîne spécifiée

d'une chaîne comme ceci:

"PrivateFactoryAsclsFactoryPrivateFactoryAsclsFactory" 

Je veux supprimer uniquement les occurrences de "Factory" qui ne sont pas précédés par "cls". Dans ce cas particulier, si tous les matches sont correctement remplacés par "_", le résultat ressemblera à ceci:

"Private_AsclsFactoryPrivate_AsclsFactory" 

Bien sûr, un truc simple d'exclusion comme "clsFactory|(Factory)" ne fonctionne en VBA, ni ne regarde autotractées.

Répondre

2

Vous pouvez réellement faire un lookbehind négatif avec un peu d'un hack en utilisant la bibliothèque VBScript Regex. Le modèle suivant correspond à deux caractères ou moins ou trois caractères quelconques qui ne sont pas "cls" (en utilisant une vue d'ensemble négative), suivi de "Factory".

Const strText As String = "PrivateFactoryAsclsFactoryPrivateFactoryAsclsFactory" 

With CreateObject("VBScript.RegExp") 
    .Pattern = "(^.{0,2}|(?!cls).{3})Factory" 
    .Global = True 
    Debug.Print .Replace(strText, "$1_") 
End With 

Sortie:

Private_AsclsFactoryPrivate_AsclsFactory 
+0

solution fonctionne bien et est un peu plus complexe que prévu, le temps d'étudier à nouveau :) merci pour votre réponse rapide! (vous avez juste une petite faute de frappe, elle se termine par la fin et non par la fin si) – tsolina

+0

Oups, faute de frappe. Merci. – Bond