代码之家  ›  专栏  ›  技术社区  ›  Dancrumb

如何确保regex与空字符串不匹配?

  •  1
  • Dancrumb  · 技术社区  · 15 年前

    我用的是 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" (6英尺4英寸)或 4"5s (4英寸,6分之5)数字和指示器之间有任何空格。

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

    我的问题是:有没有办法修改这个regex以保证它只匹配非零长度的字符串?

    编辑 尽管regex中有捕获组,但我不需要捕获这些组。我知道我可以使用非捕获组,但是没有 (?:...) .

    2 回复  |  直到 15 年前
        1
  •  1
  •   tiftik    15 年前

    您可以添加 (?=.) 在你的regex开始的时候。

        2
  •  0
  •   Jon    15 年前

    问题是你的第一行中的所有内容都是可选的-或者 ? (0或1)或 * (0或以上)。

    我对帝国制度不太熟悉(我以前从未见过六十年代……),但可能有点像

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

    这肯定会确保它与空字符串不匹配,问题是它允许类似5s4“6”的内容,这可能不是您想要的……