将 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 中的“功能”,它应该是您可以打开和关闭的东西。如果这是意外行为,那么它可能是一个错误吗?