試合内でより短い試合を好む正規表現?(これは貪欲でないよりも複雑です)


9

バッファ内であいまい検索を実行するためのスクリプトを作成しようとしています。主なアイデアは、何らかの入力を取り.\{-}、すべての文字のペアの間に挿入することです。たとえば、にfooなりf.\{-}o.\{-}oます。

これはかなりうまく機能しますが、理想的ではない多くの一致が生じます。あいまい検索では、最短の一致が最初に得られると思います。次の例について考えてみます。

public void put()

put(so、p.\{-}u.\{-}t)のあいまい検索を実行すると、文字列全体に一致しますpublic void putが、putその一致内で短い方が便利です。

貪欲でない演算子は、早く終了する一致を見つけるのに適していますが、同時に開始する一致を優先できるものが必要です。概念的には、両方向で貪欲ではないはずです。これは可能ですか?


参照:stackoverflow.com/q/15191291(残念ながら質問に対する回答はありません)
Doorknob

1
@Doorknob、答えはありませんが、それは良い点をもたらします:Regexは文字列の途中から検索を開始しません。仕事を終わらせるために、いくつかのVimScriptを含める必要があるかもしれません。(長い)一致を逆にして、逆のパターンを検索するというアイデアを模索しています。
tommcdo 2015

2
Tim Popeは本日vim-haystackをリリースしました。必要なものに似ています。多分あなたはそれからいくつかのインスピレーションを得たり、多分それを使用することさえできます。
tokoyami 2015

1
パターンを満足させながら、できるだけ早く試合を開始し、できるだけ早く試合を終了させたいと思います。
tommcdo 2015

1
いわゆる近似文字列照合アルゴリズムを確認する必要があります。これらは、正規表現よりもファジーファインダーを実装するためのより適切なツールです。
toro2k

回答:


2

十分な例はありませんが、これはあなたが望んでいることだと思います。

.*\zsp.\{-}u.\{-}t

putあなたの例ではの代わりに一致しますpublic void put。基本的に、.*は正規表現エンジンに文字列を逆方向に検索させます。これは.*、が最初に文字列全体を消費し、次にバックトラックして、p.\{-}u.\{-}t


私は以前これを試しました(しかし、今まで忘れていました)。それはかなり良いですが、それは行ごとに1つの一致のみが存在することを意味します(可能な最後の一致)。私はまだpouty puppet2つの試合をもたらすような行が欲しいです。
tommcdo 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.