Hi Matt,
Matching a not string as opposed to a not character is a problem with vbscript regexp. Perl offers a negative lookahead which lets you do this, I've posted the Perl example below - which is likely to annoy you once you see it is exactly what you want but vbscript won't let you do it
"(?!pattern)"
A zero-width negative look-ahead assertion. For example
"/foo(?!bar)/" matches any occurrence of "foo" that isn't
followed by "bar".
"(?<!pattern)"
A zero-width negative look-behind assertion. For example
"/(?<!bar)foo/" matches any occurrence of "foo" that does not
follow "bar". Works only for fixed-width look-behind.
But back to VBscript
if you try this
^(abc).+[^def].+ghi$
the regular expression is actually looking for
start string.....abc...anything but d or e or f....ghi...end string
not
start string.....abc...anything but def....ghi...end string
and if you try making the string a submatch you will find the regexp
merely adds "(" and ")" to the don't match group
^(abc).+[^(def)].+ghi$
so you could use two regexps, ie
Dim RegEx As Object
Dim TestStr As String
' TestStr = "abcdeftmeghi" 'invalid
TestStr = "abcdeghi" ' valid
'TestStr = "abcghi" ' invalid as there must be at least once character between abc and ghi
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Pattern = "(.+)(def)(.+)"
.Global = False
.MultiLine = True
'test for one string of "def". "def cannot start or finish the string"
If .test(TestStr) = False Then
'replaced "def" with "" and test for "abc" at front, and "ghi" at end
TestStr = .Replace(TestStr, "$1$3")
.Pattern = "^(abc).+ghi$"
MsgBox "String test is " & .test(TestStr)
Else
MsgBox "string not tested as it contains ""def"" somewhere between the first and last characters"
End If
End With
Now, gimme points 
Cheers
Dave