如何确保正则表达式与空字符串不匹配?

时间:2010-03-12 04:04:44

标签: javascript regex

我正在使用Jison解析器生成器来处理Javascript,并且我的语言规范存在问题。

我正在编写的程序将是一个可以处理英尺,英寸和十六分之一的计算器。 为此,我有以下规范:

%%
([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"5s(4英寸,五十六分之一),数字和指标之间有任何类型的空白

问题是正则表达式匹配空字符串。因此,词法分析总是在行的开头记录一个FIS,然后解析失败。

这是我的问题:有没有办法修改这个正则表达式,以保证它只匹配一个非零长度的字符串?

修改 虽然正则表达式中包含捕获组,但我不需要捕获这些组。我知道我可以使用非捕获组,但如果没有(?:...),它会更清晰。

2 个答案:

答案 0 :(得分:1)

您可以在正则表达式的开头添加(?=.)

答案 1 :(得分: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'这样的东西,这可能不是你想要的......