2012-07-30 68 views
0

我試圖寫使用JFlex的對FitNesse的詞法分析器的結束,並因與WikiWords麻煩(http://fitnesse.org/FitNesse.UserGuide.WikiWord)可選JFlex的前瞻與文件

我複製正則表達式鏈接和我使用令牌下面的正則表達式:

.        # Regular character 
[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ # WikiWord 

我無法正確地樂星ThisIsNotAWikiWord雖然。它有2個大寫字母,所以不應該被認爲是一個普通的詞。所以我需要添加一個前視來檢查下一個字符是字母還是數字。像[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+/[^A-Za-z0-9]

這適用於lexing ThisIsNotAWikiWord,但它一般會打破Wikipedia的搜索條件。當搜索WikiWord時,沒有額外的預見符,所以它不匹配。

我想我想要一個可選的前瞻。如果在此之後有一個角色,那麼最好不要成爲其中的一個。但是如果輸入中沒有另一個字符,讓我們匹配。

該文檔使我相信這是不可能的,但我希望這只是我缺乏正則表達式。從文檔:

在詞彙規則中,正則表達式r後面可能跟着一個預見式表達式。先行表達式既可以是'$'(行結尾的操作符),也可以是後面跟隨任意正則表達式的'/'。在這兩種情況下,超前並不會被消耗,也不會被包含在匹配的文本區域中,但是在確定哪個規則具有最長匹配時會被考慮(參見4.3.3輸入如何匹配)。

在'$'情況下,r只匹配輸入中一行的末尾。一行的結尾用正則表達式\ r | \ n | \ r \ n | \ u2028 | \ u2029 | \ u000B | \ u000C | \ u0085表示。因此,$相當於一個/ \ r | \ n | \ r \ n | \ u2028 | \ u2029 | \ u000B | \ u000C | \ u0085。這與[5]中描述的情況有點不同: JFlex $是一個真正的尾隨上下文,文件的末尾不計爲行尾。

回答

0

在這裏看起來周圍似乎並不需要。

據我所知,您正在尋找以大寫字母開頭的駝背字,但可以包含數字,其中數字爲小寫字母,每個駝峯必須是一個大寫字母,只有案件信。如果這是正確的,這個正則表達式應該爲你工作:

\b((?:[A-Z][a-z\d]+){2,})\b 

(?:部分使括號非捕獲。

[A-Z][a-z\d]+可以確保只有一個大寫字母后跟至少一個小寫字符。

{2,}強制重複至少兩次以至於會產生至少一個駝峯。

+0

您應該使用正確的單詞邊界('\ b'),否則您的正則表達式將在兩個連續的由一個空格分隔的WikiWords上失敗。 – 2012-07-30 06:53:36

+0

@TimPietzcker謝謝。你對單個空間是正確的,但是單詞邊界並不完全相同。它們也符合標點符號,但不清楚所需的邊界是什麼。如果標點符號不被允許作爲邊界,那麼在所有情況下都需要lookaround ... – 2012-07-30 07:40:44

+0

@d_inevitable感謝您的快速響應併爲延遲感到抱歉。不幸的是,JFlex似乎並不支持'(?:'只用'\ b([AZ] [az \ d] +([AZ] [az \ d] +)+)\ b',JFlex聲稱它可以由於某種原因,不匹配'WikiWord'的輸入::( – 2012-08-01 01:10:50