2014-01-16 28 views
0

我有一個MS Access數據庫與function(感謝@MPękalski)沿着由在查詢稱爲加入在MS Access數據庫中存儲的正則表達式殺死功能

create table OSS_File(
    id number, 
    Kw text(255)); 

insert into OSS_File(ID,kw) values(1,"black or white"); 
insert into OSS_File(ID,kw) values(2,"green"); 
insert into OSS_File(ID,kw) values(3,"blue berry"); 
insert into OSS_File(ID,kw) values(4,"blueberry"); 
insert into OSS_File(ID,kw) values(5,"bluegreen"); 
insert into OSS_File(ID,kw) values(6,"yellow"); 

create table restricted_words(
    restricted_word text(255));  

insert into restricted_words(restricted_word) values("\bblack\b"); 
insert into restricted_words(restricted_word) values("^green$"); 
insert into restricted_words(restricted_word) values("^blue[ ]?berry$"); 
insert into restricted_words(restricted_word) values("yellow"); 

Function my_regexp(ByRef sIn As String, ByVal mypattern As String) As String 
    Dim r As New RegExp 
    Dim colMatches As MatchCollection 
    With r 
     .Pattern = mypattern 
     .IgnoreCase = True 
     .Global = False 
     .MultiLine = False 
     Set colMatches = .Execute(sIn) 
    End With 
    If colMatches.Count > 0 Then 
     my_regexp = colMatches(0).Value 
    Else 
     my_regexp = "" 
    End If 
End Function 

SELECT restricted_words.restricted_word, OSS_File.ID, OSS_File.kw 
FROM restricted_words INNER JOIN OSS_File 
ON restricted_words.restricted_word=my_regexp(nz(OSS_File.kw),restricted_words.restricted_word); 

我本來期望得到所有,但ID#5回來,但我只得到#6回來。 然而,如果我刪除了^,$或\ b口改寫像

.Pattern = "^" & mypattern & "$" 
or 
.Pattern = "\b" & mypattern & "\b" 

的功能,我可以得到返回結果(除了「藍[]?漿果」由於[])。

爲什麼當整個正則表達式存儲在表中馬赫失敗?

+0

「\ B」 可能是退格字符。一般來說,你必須逃避所有的逃跑,還是Vba不同?什麼是空字符類'[]'? – sln

+0

嘗試在'with'塊之前插入'Msgbox mypattern',以便仔細檢查它包含的內容。 –

+0

@sln []?是一個非必需的空間來匹配藍莓和藍莓(我不寫規格,我只需要編程它們:)) – Aba

回答

1

由於@HansUp指出兩側我的「ON」永不相匹配,以便我所做的是,如果有一場比賽,我回到了原罪(OSS_File.kw)字符串如果不是我回來「 「(除非sIn是」「,所以我返回x),然後我把OSS_File.kw放在on的左邊。

Function my_regexp(ByRef sIn As String, ByVal mypattern As String) As String 
    Dim r As New RegExp 
    Dim colMatches As MatchCollection 
    With r 
     .Pattern = mypattern 
     .IgnoreCase = True 
     .Global = False 
     .MultiLine = False 
     Set colMatches = .Execute(sIn) 
    End With 
    If colMatches.Count > 0 Then 
     my_regexp = sIn 
    ElseIf sIn = "" Then 
     my_regexp = "x" 
    Else 
     my_regexp = "" 
    End If 
End Function 

SELECT restricted_words.restricted_word, OSS_File.ID, OSS_File.kw 
FROM restricted_words INNER JOIN OSS_File ON OSS_File.kw=my_regexp(nz(OSS_File.kw),restricted_words.restricted_word); 

再次感謝大家

3

你加入的ON條款等

ON 
restricted_words.restricted_word 
= 
my_regexp(nz(OSS_File.kw),restricted_words.restricted_word); 

restricted_word"^blue[ ]?berry$"

在右邊的是加入一個正則表達式模式這樣的,你問的函數的返回值如"blue berry"

模式與基於該模式的函數返回值不匹配。

考慮一種不同的方法。

FROM restricted_words AS r, OSS_File AS o 
WHERE my_regexp_test(o.kw, r.restricted_word) = True 

這是在即時窗口中測試的功能。

? my_regexp_test("blue berry", "^blue[ ]?berry$") 
True 
? my_regexp_test("blueberry", "^blue[ ]?berry$") 
True 
? my_regexp_test("strawberry", "^blue[ ]?berry$") 
False 

Function my_regexp_test(ByRef sIn As String, 
     ByVal mypattern As String) As Boolean 

    Dim r As New RegExp 
    With r 
     .pattern = mypattern 
     .IgnoreCase = True 
     .Global = False 
     .Multiline = False 
    End With 
    my_regexp_test = r.Test(sIn) 
End Function 
+0

我的第一反應「我很愚蠢」 – Aba

+0

SELECT DISTINCT o.ID,o.kw FROM restricted_words as r,OSS_File as o WHERE(((my_regexp_test(nz(o.kw),r.restricted_word))=真正)); 的工作原理如同廣告。 然而,我想要的圖案標記關鍵字(千瓦) SELECT r.restricted_word,o.ID,o.kw FROM restricted_words R,OSS_Fileö WHERE(((my_regexp(NZ(o.kw)中,r。 restricted_word))=真)); 返回笛卡爾積,所以我需要繼續工作。 謝謝你讓我朝着正確的方向前進 – Aba