我正在使用用于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,然后解析失败。
这是我的问题:有没有办法修改这个正则表达式来保证它只会匹配一个非零长度的字符串?
编辑 虽然正则表达式已经捕捉它团体,我并不需要捕捉这些群体。我知道我可以使用非捕获组,但没有(?:...)
,它会更清晰一些。
谢谢!不幸的是,这个正则表达式不被Jison支持,但是为了解决我所问的* actual *问题而得到的赞誉......添加这个*会正确地匹配字符串 – Dancrumb 2010-03-12 07:10:55
纠正......这个正则表达式**被Jison支持。 对于我的具体需求,我必须使用:(?= [^ 0-9 */\ - +()]),以便它不会与其他标记 – Dancrumb 2010-03-12 23:40:36