我試圖寫使用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 $是一個真正的尾隨上下文,文件的末尾不計爲行尾。
您應該使用正確的單詞邊界('\ b'),否則您的正則表達式將在兩個連續的由一個空格分隔的WikiWords上失敗。 – 2012-07-30 06:53:36
@TimPietzcker謝謝。你對單個空間是正確的,但是單詞邊界並不完全相同。它們也符合標點符號,但不清楚所需的邊界是什麼。如果標點符號不被允許作爲邊界,那麼在所有情況下都需要lookaround ... – 2012-07-30 07:40:44
@d_inevitable感謝您的快速響應併爲延遲感到抱歉。不幸的是,JFlex似乎並不支持'(?:'只用'\ b([AZ] [az \ d] +([AZ] [az \ d] +)+)\ b',JFlex聲稱它可以由於某種原因,不匹配'WikiWord'的輸入::( – 2012-08-01 01:10:50