在VsVim中搜索时,匹配不会停留在EOL

时间:2014-10-01 14:56:29

标签: regex vim vsvim

将VS 2010与VsVim结合使用。

我发现搜索引用的文字,例如

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

这是我为查找引号而做出的几项不同努力之一,可能是一些不包括引号的内容,后跟另一个引号,例如"stuff"""(空字符串),或者其他其他引用的字符串。

此搜索不一定仅限于一行。我还没有进行任何详尽的分析,以确定所有这些多行匹配是否存在共同点,尽管转义引号(\")似乎相当普遍。

我尝试了一些限制性添加内容,但直到我将\n添加到排除集后才停止这样做。

在gVim中,默认情况下,搜索仅限于一行。

我可以看到搜索跨线端边界的优势,但这不是我想要的默认值。

我错过了一个设置吗?

以下是来自该正则表达式的匹配示例:

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

这两行代码,包含五个匹配项。

"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>" );

第一场比赛从'"'在第一行开始,直到L"之前的<DQ>,第二场比赛在{{1}之后获得"并继续直到最后一行<DQ>的开头引号。

发生的事情并不是一个谜。令人费解的是,默认情况下决定允许匹配包含换行符。


好的,所以我做了一些实验。这就是我认为正在发生的事情。

它是"<NL>"子表达式,就像我所知道的那样。我开始表达的内容并不重要,如果我写[^"]我得到类似的行为,新行就是字面意思 - &#34;不是只有下划线的成员&#34 ;。 (或者,它隐含地是&#34;所有不是下划线的成员&#34;。)

在普通搜索(/_[^_]_/中,搜索两个下划线之间的任何内容),搜索保持在一行(或者更准确地说,不会跨越换行符) ,因为换行实际上并不是&#34;零或更多的任何东西&#34;

因此,换行符不是/_.*_/的成员,但 .*[^_]的成员,或者选择任何内容你想排除。

为确保搜索不会跨越换行边界,排除集必须明确包含[^"](换行符)。

我已经确认gVim隐含地排除了&#34;不是其中一个&#34;组。为了让gVim包含行尾,必须在\n前加上集合括号,因此:\_(或在集合中包含\_[])。


结论:如果这是&#34;功能&#34;在VsVim中,它应该是你可以打开和关闭的东西。如果是意外行为,那么它可能是一个错误吗?

1 个答案:

答案 0 :(得分:0)

Jared对1.8版本的Regex内容进行了大量修复,使其更符合Vim对Regex的看法。在Visual Studio 2010和2013上运行VsVim 1.8.0我无法再重现这一点。

所以看起来您的解决方案是升级到最新版本。