0

文字列が正規表現と段階的に (一度に 1 文字ずつ) 一致するかどうかを確認し、不確定な結果を返すことができる 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.

編集:明確にするために、追加はテスト対象の文字列を構築しています。新しいマッチャーは空の文字列に対してテストを開始し、matcher.append('foo') の後に foo と照合します。appendToString または buildUpString の方が適切な名前である可能性があります。

また、これをどのように実行できるかについて 1 つの考えがありますが、まだ完全には考えていません。おそらく、元の正規表現が一致する文字列の先頭である場合にのみ、文字列に一致する元の正規表現から「潜在的な一致」正規表現を構築することが可能です。

4

2 に答える 2

1

パーサー ルールが適切な形式言語の正規表現のみを使用する (つまり、後方参照、先読み、または後読みを使用しない) 場合、それらを NFA に変換し (Thompson の構造などを使用)、標準の 2 スタック NFA シミュレーション アルゴリズムを介して各文字をプッシュできます。 : キャラクターにトランジションがない場合は、「いいえ」です。1 つあり、現在の状態セットに最終状態がある場合は、「はい」です。それ以外の場合は、「たぶん」になります。

于 2012-10-08T04:01:55.617 に答える
0

「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​

http://jsfiddle.net/f0t0n/Nkyyd/

ビジネス要件を正確に説明できますか? たぶん、タスクを実装するためのよりエレガントな方法が見つかるでしょう。

于 2012-10-08T00:55:19.137 に答える