1

VsVim で VS 2010 を使用します。

引用されたテキストの検索、たとえば

/["][^"]\{0,\}["]

"stuff"これは、引用符を見つけるために私が行ったいくつかの異なる努力の1つです。おそらく、引用符を除くいくつかのものの後に、別の引用符が続き""ます。

この検索は必ずしも 1 行に限定されるわけではありません。\"エスケープされた引用符 ( ) はかなり一般的であるように見えますが、これらすべての複数行の一致に共通点があるかどうかを判断するための徹底的な分析はまだ行っていません。

\n私はいくつかの制限付きの追加を試みましたが、除外セットに追加するまで、それをやめることはありませんでした.

gVim では、検索はデフォルトで 1 行に限定されます。

行末の境界を越えて検索することの利点はわかりますが、それはデフォルトとして望んでいるものではありません。

私が見逃した設定はありますか?

その正規表現からの一致の例を次に示します。

        oss << "bonus game conditions \"" << index << "\" not found for bonus game \""
        << bonusGameID << "\"";

これは、5 つの一致を含む 2 行のコードです。

"bonus game conditions \"
" << index << "
" not found for bonus game \"

それから

"
        << bonusGameID << "

""

私たちが興味を持っている試合はこれです:

"
        << bonusGameID << "

それは改行にまたがるものだからです。


別のものを次に示します。最初の引用符はアポストロフィで囲み、単一引用符で囲みます。

                CharReplace( *it, wchar_t( '"' ), L"<DQ>" );

            if ( !arg.empty() )
            {
                args.push_back( arg );
            }
        }

        it++;
    }

    // Re-compose the string from words
    WordsToString( words, delimiters, _str );

    // Replace newlines with ICU specifiers (NOTE: CS3 uses '\r' instead of '\n' for a newline)
    CharReplace( _str, wchar_t( '\n' ), L"<NL>" ) || CharReplace( _str, wchar_t( '\r' ), L"<NL>" );

最初の一致は が'"'1 行目からL"beforeまでの場所から始まり、2 番目の一致は の後に があり、最後の行のの開始引用符まで続きます。<DQ>"<DQ>"<NL>"

何が起こっているのかは、謎ではありません。不可解なのは、マッチにデフォルトで改行を含めることを許可するという決定です。


さて、私はもう少し実験をしました。これが私が起こっていると思うことです。

[^"]私が知る限り、それは部分式です。式を何から始めるかは関係ありません。/_[^_]_/同様の動作が得られると書くと、改行は、文字通り、「アンダースコアのみのセットのメンバーではありません」です。(または、暗黙的に「アンダースコア以外のすべて」のメンバーです。)

通常の検索 ( /_.*_/2 つのアンダースコアの間にあるものを貪欲に検索する ) では、改行は実際には "ゼロまたはそれ以上の何か」。

したがって、改行はのメンバーではありません.*、のメンバーであるか、または除外したいものを選択します。 [^_][^"]

検索が改行境界を越えないようにするには、除外セットに\n(改行) を明示的に含める必要があります。

私は、gVim が暗黙のうちに改行を「not-one-of-these」セットから除外することを確認しました。gVim に行末を含めるには、次のよう\_に、コレクション ブラケットの先頭に追加する必要があります \_[](または\nコレクションに a を含めます)。


結論: これが VsVim の「機能」である場合は、オンとオフを切り替えることができるものである必要があります。予期しない動作である場合、バグである可能性はありますか?

4

1 に答える 1

0

Jared は 1.8.0 で Regex に関する一連の修正を行い、Vim の Regex への準拠を強化しました。Visual Studio 2010 と 2013 で VsVim 1.8.0 を実行すると、これを再現できなくなりました。

したがって、解決策は最新バージョンにアップグレードすることのようです。

于 2015-04-16T15:24:59.533 に答える