2013-12-19 5 views
-2

У меня проблемы с регулярным выражением, чтобы проверить, допустимо ли строка, и если не отображать сообщение. Я проверил учебники и нашел это, но он всегда возвращает true, соответствует ли строка или нет.Почему test.regex всегда возвращает true?

Function TestRegEx(regex As Object, testpattern As String, stringtotest As String) As Boolean 
Dim regMatch As Object ' MatchCollection 

With regex 
.Pattern = testpattern 
.MultiLine = False 
End With 

' match test string against regex string 
Set regMatch = regex.Execute(stringtotest) 
TestRegEx = (regMatch.Count > 0) 
End Function 



Sub TestRegex() 
Dim regex As Object ' RegExp 
Dim pattern As String 
Dim inputstring As String 

Set regex = GetRegEx 
If Not regex Is Nothing Then 
testpattern = "[0-9]{1,3}" ' 1 to 3 numbers 
stringtotest = "12" 
MsgBox TestRegEx(regex, pattern, inputstring) 
End If 
End Sub 

Если я пишу что-то еще в: stringtotest, как: собаки, воздушный шар, 3333 всегда возвращает True.

testpattern = "^[0-9]{5}$" 
stringtotest = "KB" 

возвращается также: Правда

Я пытался добавить

If TestRegEx(regex, pattern, inputstring) = True Then 
msgbox "OK" 
Else 
msgbox "NotOK" 
End IF 

Но это не работает, я всегда получаю OK. Что не так с кодом? Как это исправить?

То же самое происходит с моим собственным кодом.

В моем случае мне нужно проверить, есть ли тема письма в Outlook, содержащая определенную строку. Я использую немного другой код, затем учебник, но он никогда не получает False.

regex.pattern = "Cid#\d{4}" 

If regex.Test(msg.Subject) = True Then 
... 
Else 
... 

Редактировать

Function GetRegEx() As Object 
On Error Resume Next 
Set GetRegEx = CreateObject("VBScript.RegExp") 
End Function 

Я забыл это, извините.

И я нашел этот учебник по jpsoftware

edit2: Мой код

Dim objInsp As Outlook.Inspector 
Dim msg As Outlook.MailItem 
Dim regex As New RegExp 
Dim prevsubj As String 


Set objInsp = Application.ActiveInspector 
Set msg = objInsp.CurrentItem 
prevsubj = msg.Subject 
subjlen = Len(prevsubj) 


regex.IgnoreCase = False 
regex.pattern = "Cid#\d{4}" 
Set regex = GetRegEx 


If regex.Test(msg.Subject) = True Then 

MsgBox regex.Test(msg.Subject) 


newtempsubj = Left(prevsubj, subjlen - 8) 
msg.Subject = newtempsubj & " Cid#" & 'newidstring 
msg.Close olSave 
Else 

MsgBox prevsubj 

msg.Subject = prevsubj & " Cid#" & 'newidstring 
msg.Close olSave 

End If 

Спасибо заранее, Z

+0

Ваш код не имеет смысла. 'regex.Test' не существует, и вы проверяете возвращаемое значение из' Sub'.? –

+0

'GetRegEx' что это такое – sam092

+0

Я сказал, что мой код отличается, и в моем коде' regex.Test' существует. Первая часть - это полный учебник, из которого я хотел бы понять эти функции. – ZZA

ответ

1

Okay. Я нашел это. Одна глупая ошибка - Опечатка.

У вас есть одна переменная, называемая testpattern, а другая - pattern.

testpattern = "[0-9]{1,3}" должен быть pattern = "[0-9]{1,3}" вместо

подобным образом, у вас есть stringtotest и inputstring. Измените это также

+0

Вы правы! Я думал, что этот учебник будет работать так, как он есть, и не мог понять это. Теперь я переписал свой собственный код в соответствии с этим, потому что это отлично работает. Спасибо. – ZZA

+0

Чтобы избежать такой же ошибки, я предлагаю разработать привычку объявлять переменные перед использованием. Это можно выполнить, добавив параметр Option Explicit – sam092

Смежные вопросы