2010-03-12 103 views
1

我正在使用用於Javascript的Jison解析器生成器,並且遇到了我的語言規範問題。如何確保正則表達式不匹配空字符串?

我正在寫的程序將是一個可以處理英尺,英寸和十六分之一的計算器。 爲了做到這一點,我有以下規格:

%% 
([0-9]+\s*"'")?\s*([0-9]+\s*"\"")?\s*([0-9]+\s*"s")? {return 'FIS';} 
[0-9]+("."[0-9]+)?\b {return 'NUMBER';} 
\s+     {/* skip whitespace */} 
"*"     {return '*';} 
"/"     {return '/';} 
"-"     {return '-';} 
"+"     {return '+';} 
"("     {return '(';} 
")"     {return ')';} 
<<EOF>>    {return 'EOF';} 

這些線路來自一個簡單的計算器規範。我只是添加了第一行。

正確匹配英尺,英寸,十六分之一,例如6'4"(六英尺4英寸)或4"5s(4英寸,5十六分之五)與數字和指標之間的任何類型的空格。

問題是,正則表達式匹配一個空字符串。因此,詞彙分析始終在行首開始記錄FIS,然後解析失敗。

這是我的問題:有沒有辦法修改這個正則表達式來保證它只會匹配一個非零長度的字符串?

編輯 雖然正則表達式已經捕捉它團體,我並不需要捕捉這些羣體。我知道我可以使用非捕獲組,但沒有(?:...),它會更清晰一些。

回答

1

你可以在你的正則表達式的開頭添加(?=.)

+0

謝謝!不幸的是,這個正則表達式不被Jison支持,但是爲了解決我所問的* actual *問題而得到的讚譽......添加這個*會正確地匹配字符串 – Dancrumb 2010-03-12 07:10:55

+0

糾正......這個正則表達式**被Jison支持。 對於我的具體需求,我必須使用:(?= [^ 0-9 */\ - +()]),以便它不會與其他標記 – Dancrumb 2010-03-12 23:40:36

0

的問題是,一切都在你的第一行是可選的 - 無論是?(0或1)或*(0或更多)。

我不是太熟悉的帝國制度(我從來沒有見過十六分之前...),但也許像

([0-9]+\s*["'s])+ (with whatever escaping is necessary for the " and ' - I'm not a javascript guy) 

這無疑保證了它不匹配一個空字符串,這個問題是它將允許像5S 4" 6' ,這可能是不太你想要什麼......

+0

啊...這是我目前正在使用的解決方案。對於orde,您絕對是正確的環問題。現在,這由'FIS.fromString'方法處理(在別處定義) – Dancrumb 2010-03-12 05:06:58