1

将 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>,然后一直持续到最后一行的开头引用。"<DQ>"<NL>"

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


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

[^"]几乎是我所知道的子表达式。不管我用什么开始表达式,如果我写/_[^_]_/我得到类似的行为,换行符是——从字面上看——“不是只有下划线的集合的成员”。(或者,它隐含地是“所有非下划线”的成员。)

在正常搜索 ( /_.*_/,对两个下划线之间的任何内容进行贪婪搜索) 中,搜索停留在单行上(或者更准确地说,不跨越换行符),因为换行符实际上不是 "零个或更多的任何东西”。

因此,换行符不是其中的成员,.*但它or的成员,[^_]或者[^"]选择您要排除的任何内容。

为确保搜索不跨越换行符边界,排除集必须明确包含\n(换行符)。

我已经确认 gVim 隐含地从“不是这些”集中排除了换行符。为了让 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 回答