首页 > 解决方案 > Peg.js 和正则表达式之间的区别

问题描述

我想使用 Peg.js 来解析和验证我一直在用正则表达式做的事情,并且正在努力解决语法问题。

我的 Peg.js 程序是:

start = (var / other) cr 
d:var {return d.join('')}

var = [^(?=.{1,32}$)([a-zA-Z_][a-zA-Z0-9_]*)$] {return "OK"}
other = . {return "NOT OK"}
cr = "\n"

我正在使用以下文本对其进行测试:

test1
no space
1var
_temp
ReallyLongNameisInvalidandLongerthan32
IncorrectChars!!asdf
_
underscore_is_fine_

我希望结果是 YES,NO,NO,YES,NO,NO,YES,YES,但是我会在正常情况下正常工作的正则表达式错误中绕圈子。

标签: javascriptregexpeg

解决方案


当一个 peg 规则匹配失败时,它将尝试匹配下一个规则,直到它用完规则。尝试以下方式:

start = line+

line = d:(var / other)
{
    return d;
}

var = v:$([a-zA-Z_][a-zA-Z0-9_]*) cr
{
    if (v.length > 32) {
        return "no";
    } else {
        return "yes";
    }
}

other = [^\n]+ cr
{
    return "no";
}

cr = "\n"

输出:

[
   "yes",
   "no",
   "no",
   "yes",
   "no",
   "no",
   "yes",
   "yes"
]

推荐阅读