带有增量测试的Javascript正则表达式库

带有增量测试的Javascript正则表达式库,javascript,regex,node.js,Javascript,Regex,Node.js,我正在寻找一个JavaScript库(理想情况下是node.js包),它可以检查字符串是否增量匹配正则表达式(即一次一个字符),并返回不确定的结果。例如,假设我有以下正则表达式: j.*s.* 我想测试字符串“javascript”。我想要一个类似于以下内容的API: var iregex = new IncrementalRegex('j.*s.*'); var matcher = iregex.createMatcher(); matcher.append('j'); matcher.te

我正在寻找一个JavaScript库(理想情况下是node.js包),它可以检查字符串是否增量匹配正则表达式(即一次一个字符),并返回不确定的结果。例如,假设我有以下正则表达式:

j.*s.*
我想测试字符串“javascript”。我想要一个类似于以下内容的API:

var iregex = new IncrementalRegex('j.*s.*');
var matcher = iregex.createMatcher();
matcher.append('j');
matcher.test(); //returns "possible match"
matcher.append('a');
matcher.test(); //returns "possible match"
matcher.append('v'); matcher.append('a'); matcher.append('s');
matcher.test(); //returns "match found"
matcher.append('ript');
matcher.test(); //returns "match found"
然而,如果我测试字符串“foo”,我会期望如下所示:

var matcher2 = iregex.createMatcher();
matcher.append('f');
matcher.test(); //returns "no match possible"
//At this point I wouldn't bother appending "oo" because I know that no match is possible.
编辑: 明确地说,append正在构建正在测试的字符串。一个新的matcher开始对空字符串进行测试,在matcher.append('foo')之后,它匹配foo。appendToString或buildUpString可能是更好的名称

此外,我有一个想法,如何可能做到这一点,但我还没有充分考虑过。也许可以从原始正则表达式构建一个“潜在匹配”正则表达式,当且仅当它们是原始正则表达式匹配的字符串的开头时,才会匹配字符串。

您的“IncrementalRegex”可以通过使用封装的
RegExp
对象来实现

function Matcher(pattern, flags) {
    this.setExpression(pattern, flags);
}

Matcher.prototype.setExpression = function(pattern, flags) {
    this.pattern = pattern;
    this.flags = flags;
    this.re = new RegExp(this.pattern, this.flags);
};

Matcher.prototype.append = function(pattern) {
    this.setExpression(this.pattern + pattern, this.flags);
};

Matcher.prototype.test = function(str) {
    return this.re.test(str);
};

var matcher = new Matcher('j.*s.*', 'i'),
    str = 'JavaScript';

function test() {
    console.log(matcher.re.source, ':', matcher.test(str));
}

test(); // true
matcher.append('ri');
test(); // true
matcher.append('.t');
test(); // true
matcher.append('whatever');
test(); // false​


你能描述一下确切的业务需求吗?也许我们会为您的任务实现找到一些更优雅的方法。

如果您的解析器规则只使用适当的形式语言正则表达式(即没有反向引用、lookaheads或lookbehind),您可以将它们转换为NFA(使用Thompson的构造或类似的构造)然后通过标准的两层NFA模拟算法推送每个角色:如果角色上没有过渡,则得到“否”;如果有一个,并且您在当前状态集中有一个最终状态,那么您就得到了“是”;否则,您的实现中会出现“maybe”。

在模式中附加附加,而不是构建正在测试的字符串。我打算在Earley解析器中使用它,该解析器可以使用包含正则表达式的产生式规则。