【发布时间】:2014-10-01 14:56:28
【问题描述】:
将 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>" );
第一场比赛开始,'"' 在第一行直到<DQ> 之前的L",第二场比赛在<DQ> 之后拿起",一直持续到@ 的开场报价最后一行是 987654338@。
发生的事情并不是一个谜。令人费解的是允许匹配默认包含换行符的决定。
好的,所以我做了更多的实验。这就是我认为正在发生的事情。
据我所知,这是[^"] 子表达式。不管我用什么开始表达式,如果我写 /_[^_]_/ 我会得到类似的行为,换行符是——从字面上看——“不是只有下划线的集合的成员”。 (或者,它隐含地是“所有非下划线”的成员。)
在普通搜索中(/_.*_/,对两个下划线之间的内容进行贪婪搜索),搜索停留在单行上(或者更准确地说,不跨越换行符),因为换行符实际上不是“零个或多个任何东西”的成员。
所以换行符不是.* 的成员,但它是是[^_] 或[^"] 的成员,或者选择您想要排除的任何内容。
为确保搜索不跨越换行符边界,排除集必须明确包含\n(换行符)。
我已经确认 gVim 隐含地从“not-one-of-these”集合中排除了换行符。为了让 gVim 包含行尾,必须在集合括号前添加 \_,因此:\_[](或在集合中包含 \n)。
结论:如果这是 VsVim 中的“功能”,它应该是你可以打开和关闭的东西。如果是出乎意料的行为,那会是一个错误吗?
【问题讨论】:
-
好的,稍后进行大量编辑。 . .我认为现在是正确的。
-
我快速浏览了一下,它似乎只是一个错误。处理
$和\n的逻辑是不正确的,会导致这种行为。如果您可以提交错误github.com/jaredpar/VsVim 我可以尝试在下一个版本中修复此问题