2014-10-01 99 views
1

將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,它應該是可以開啓和關閉。如果這是意外的行爲,那麼它可能是一個錯誤?

+0

好的,以後再編輯一堆。 。 。我認爲現在是正確的。 – 2014-10-01 16:34:42

+0

我快速看了一下,它似乎只是一個錯誤。處理'$'和'\ n'的邏輯不正確,並導致這種行爲。如果你可以提交錯誤https://github.com/jaredpar/VsVim,我可以嘗試在下一個版本中解決這個問題 – JaredPar 2014-10-02 00:15:25

回答

0

Jared在1.8.0中對Regex的東西做了一系列的修正,以使它更符合Vim對Regexes的要求。在Visual Studio 2010和2013上運行VsVim 1.8.0我無法重現這一點。

所以它看起來像你的解決方案是升級到最新版本。