RegExp_Replace SubMatches i BackReferences   strona główna:
A po co ten Excel ;-)
 
Zamiast pisać bzdurne wstępy… mamy ciągi: kol.A a chcielibyśmy uzyskać ciągi z kol.B  
 
  A B C D  
1 234 56 345 28 419 234 18 56 345 28 419      
2 45 346 234 56 45 346 234 18 56      
3 456 73 218 234 23 456 73 218 234 23      
4 56 234 56 56 234 18 56      
5 57 236 56 57 234 56      
6          
 
Zabawa ma więc polegać na wstawieniu danej liczby (w przykładzie: 18) pomiędzy okreslone liczby (tu: 234 i 56). Chcemy więc zamienić   
odpowiednią spację " " na wskazaną liczbę np.: " 18 " (spacje nie są przez pomyłkę). Replace z RegExp? :-| Ok.. Tylko jak?? I to właśnie  
będzie nasze zadanie. :-)  
     Poruszam ten temat bo zawsze jak chcę wykorzystać RegExp w podobnym problemie to od początku muszę szukać składni co   
zupełnie niepotrzebnie wydłuża czas wykonania zadania. A tu będzie pod ręką :-)  
     W swoim art. dot. RegExp tego nie omawiałem z prostego powodu ;-) po prostu wtedy nie miałem o tym pojęcia. Teraz rozszerzę  
tabelę z przykładowymi Pattern'ami o tam pominięte.   
 
  Pattern opis  
1 (?:pattern) A subexpression that matches pattern but does not capture the match, that is, it is a non-capturing match that is not stored for possible later use. This is useful for combining parts of a pattern with the "or" character (|). For example, 'industr(?:y|ies) is a more economical expression than 'industry|industries'.   Regular Expression Syntax
2 (?=pattern) A subexpression that performs a positive lookahead search, which matches the string at any point where a string matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?=95|98|NT|2000)' matches "Windows" in "Windows 2000" but not "Windows" in "Windows 3.1". Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead.  
3 (?!pattern) A subexpression that performs a negative lookahead search, which matches the search string at any point where a string not matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?!95|98|NT|2000)' matches "Windows" in "Windows 3.1" but does not match "Windows" in "Windows 2000". Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead.  
4              
 
No to mamy początek :-)  
 
  A B C D   f: Replace_RegExp
1 234 56 345 28 419 =Replace_RegExp(C31;" (?=56)";" 18 ") 234 18 56 345 28 419 ok.  
2 45 346 234 56   45 346 234 18 56 ok.  
3 456 73 218 234 23   456 73 218 234 23 ok.  
4 56 234 56   56 234 18 56 ok.  
5 57 236 56   57 236 18 56 byk!!! :-)  
6          
 
ciąg " (?=56)" oznacza spację która poprzedza liczbę 56. A więc: zmaki "56" wchodzą do zapytania ale pomagają jedynie okreslić warunek/  
warunki jakie musi spełniać ciąg przed nawiasem żeby odpowiadał wzorowi pattern. W kol.C wyniki formuły a w kol.D wynik całego zadania.  
Czemu byk! ?? :-) ano dlatego że określiliśmy jedynie jeden z warunków: tj: spacja po której stoi "56". Jednak co z ciągiem "234" przed  
spacją? :-) Bez tego udać się nie mogło.  
 
W poszukiwaniu rozwizania trafiłem na określenie "look-behind"  
 
  Pattern opis   Regular Expressions
20.3 Syntax
7. Extended groups
1 (?<=subexp) look-behind Subexp of look-behind must be fixed character length. But different character length is allowed in top level alternatives only. ex. (?<=a|bc) is OK. (?<=aaa(?:b|cd)) is not allowed.
 In negative-look-behind, captured group isn't allowed, but shy group(?:) is allowed.
 
2 (?<!subexp negative look-behind  
 
jednak te sposoby, jak na złość, nie działają :-| Czemu?? Trafiłem na taką odpowiedź:   Using Regular Expressions in Visual Basic for Applications and Visual Basic 6
The VBScript RegExp Class
"the VBScript implementation does not support the "look behind" capabilities in Perl and the .Net framework"  
więc, przynajmniej na razie, "nie tędy droga" :-)  
 
Zobaczmy jeszcze..  
The Replace method takes two string parameters. The first parameter is the subject string, while the second parameter is the replacement text. If the RegExp.Global property is False (the default), Replace will return the subject string with the first regex match (if any) substituted with the replacement text. If RegExp.Global is true, Replace will return the subject string with all regex matches replaced.

You can specify an empty string as the replacement text. This will cause the Replace method to return the subject string will all regex matches deleted from it.
To re-insert the regex match as part of the replacement, include $& in the replacement text. Eg to enclose each regex match in the string between square brackets, specify [$&] as the replacement text. If the regexp contains capturing parentheses , you can use backreferences in the replacement text. $1 in the replacement text inserts the text matched by the first capturing group, $2 the second, etc. up to $9 . To include a literal dollar sign in the replacements, put two consecutive dollar signs in the string you pass to the Replace method
  How to Use the VBScript RegExp Object
 
  Pattern opis   Regular Expression Pocket Reference
Second Edition
O'Reilly Media Tony Stubblebine
(Darmowy e-book)
1 $1, $2, ...  Captured submatches.  
2 ${name} ${name} Matched text of a named capture group.  
3 $' Text before match.  
4 $& lub [$&] Text of match.  
5 $` Text after match.  
6 $+ Last parenthesized match.  
 
Spróbujemy więc re-insert'nąć cześć zapytania przed szukanej spacji dodając $& do treści podkładanej (3'ci arg. Funkcji Replace_RegExp)  
 
  A B C D  
1 234 56 345 28 419 =Replace_RegExp(A1;"234 (?=56)";"$&18 ") 234 18 56 345 28 419 ok.  
2 45 346 234 56   45 346 234 18 56 ok.  
3 456 73 218 234 23   456 73 218 234 23 ok.  
4 56 234 56   56 234 18 56 ok.  
5 57 236 56   57 236 56 ok.  
6          
 
A więc nie można określić warunku "przed naszą spacją stoi 234" ale można do stringu wynikowego re-insert'nąć dopasowanie. I to zdaje się  
Rozwiązaniem naszego zadania :-)  
     Czy to wyczerpuje temat? Oczywiście że nie :-) Jest masa niesprawdzonych przeze mnie składni. Może to że "look-behind" nie działa w   
w VBA/VB6 nie oznacza że nie uda się ich wykorzystać posługując się f. EVAL… ale to innym razem   f: Eval (przykład.7)
 
ciekawe linki: http://www.regular-expressions.info/lookaround.html  
http://www.regular-expressions.info/brackets.html  
http://www.regular-expressions.info/repeat.html  
http://manual.macromates.com/en/regular_expressions