2016-12-31 5 views
2

私はパーサーを書いているので、パフォーマンス上の理由から入力文字列を細かくしないでください。正規表現を文字列の途中で開始インデックスとどのようにマッチさせるか?

const Stream = (string, cursor) => Object.freeze({ 
    string, 
    cursor, 
    length: string.length - cursor, 
    slice: (start, end) => string.slice(start + cursor, end ? start + end : undefined), 
    move: distance => stream(string, cursor + distance), 
}) 

私は、この文字列にマッチさせる正規表現を使用することができるようにしたい:したがって、私は、カーソルを文字列で表しStreamオブジェクトを作成しました。しかし、カーソルの前には何も気にしません。だから私は、次の文字列と、カーソルがあるとします。

> string = 'hello ABCD' 
'ABCD' 
> cursor = 6 
6 

だから我々はA前に、何も気にしないが、私たちはこれらすべての大文字に一致するように正規表現を使用することができるようにしたい:

> re = /^[A-Z]+/ 
/^[A-Z]+/ 

これを動作させる方法がわかりません。 gフラグを使用すると、RegExp.execを使用でき、lastIndexのプロパティが記録されます。しかし、^の試合はlastIndexで開始しません...

どのように私は効率的にこれを得ることができますか? $

sed -rn 's/^.{'$cursor'}([A-Z]+)$/\1/p' 

:私はサードパーティの正規表現ライブラリを使用する必要がある場合は、

+2

なぜ '^。{6} [A-Z] +'のようなものを使わないのですか? –

+0

面白いアイデアだ... ^^ {10006} [A-Z] + ' – Chet

+0

これは何度も繰り返すが、パフォーマンスの問題を測定したのだろうか? –

答えて

-1

私はセッドとす​​るだろう...私はそれで大丈夫だよ、しかし、理想的にこれは、ネイティブのRegExpを行うことができますcursorは、最初に無視された文字の数を含むシェル変数です。

オプション-rは拡張正規表現です。-nは常に出力されません。一致する場合はpが印刷されます。

ここで問題はあなたの言語に移植する方法です。 Here Javascriptの正規表現で変数を使用する方法のヒントがいくつかあります。

関連する問題