將VS 2010與VsVim一起使用。在VsVim中搜索時,匹配不會停在EOL
我發現搜索引用的文本,例如
/["][^"]\{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>"
。
發生了什麼並不是一個真正的謎。令人費解的是,默認情況下允許匹配包含換行符的決定。
好的,所以我做了一些更多的實驗。這是我認爲正在發生的事情。
這就是我所知道的[^"]
子表達式。無論我從什麼時候開始表達,如果我寫/_[^_]_/
我會得到類似的行爲,換行是—字面上—「不是隻有下劃線的集合的成員」。 (或者,它隱含地是「所有不是下劃線的東西」的成員)。
在正常搜索(/_.*_/
,它對兩個下劃線之間的任何內容進行貪婪搜索)中,搜索停留在單行或者更確切地說,不會跨越換行符),因爲換行符實際上不是「零個或多個任何東西」的成員。
所以換行符是不是.*
成員,但它是的[^_]
或[^"]
成員或選擇任何要排除。
爲確保搜索不會跨越換行符邊界,排除集必須明確包含\n
(換行符)。
我已經確認gVim隱含地排除了「非一一這些」集合中的換行符。爲了讓gVim包含行尾,必須在收集括號中加上\_
,因此:\_[]
(或在集合中包含\n
)。
結論:如果這是一個「功能」在VsVim,它應該是可以開啓和關閉。如果這是意外的行爲,那麼它可能是一個錯誤?
好的,以後再編輯一堆。 。 。我認爲現在是正確的。 – 2014-10-01 16:34:42
我快速看了一下,它似乎只是一個錯誤。處理'$'和'\ n'的邏輯不正確,並導致這種行爲。如果你可以提交錯誤https://github.com/jaredpar/VsVim,我可以嘗試在下一個版本中解決這個問題 – JaredPar 2014-10-02 00:15:25