2010-03-12 189 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