1
A
回答
1
這只是您的常規正則表達式實現。
首先,模式被編譯成正則表達式(vim_regcomp
)。
接下來,使用vim_regexec{_multi,_nl,_both}
來執行它。它通過逐步處理各種原子來實現(有一個明確的回溯堆棧)。
現在,正則表達式的葉節點僅通過行人函數進行處理等
vim_strbyte
vim_strchr
cstrchr
;這一點,作爲一個例子,說明如何實施「簡單」是(特別是,如果你看的時候沒有定義FEAT_MBYTE
簡單的情況下)/* * cstrchr: This function is used a lot for simple searches, keep it fast! */ static char_u * cstrchr(s, c) char_u *s; int c; { char_u *p; int cc; if (!ireg_ic #ifdef FEAT_MBYTE || (!enc_utf8 && mb_char2len(c) > 1) #endif ) return vim_strchr(s, c); /* tolower() and toupper() can be slow, comparing twice should be a lot * faster (esp. when using MS Visual C++!). * For UTF-8 need to use folded case. */ #ifdef FEAT_MBYTE if (enc_utf8 && c > 0x80) cc = utf_fold(c); else #endif if (MB_ISUPPER(c)) cc = MB_TOLOWER(c); else if (MB_ISLOWER(c)) cc = MB_TOUPPER(c); else return vim_strchr(s, c); #ifdef FEAT_MBYTE if (has_mbyte) { for (p = s; *p != NUL; p += (*mb_ptr2len)(p)) { if (enc_utf8 && c > 0x80) { if (utf_fold(utf_ptr2char(p)) == cc) return p; } else if (*p == c || *p == cc) return p; } } else #endif /* Faster version for when there are no multi-byte characters. */ for (p = s; *p != NUL; ++p) if (*p == c || *p == cc) return p; return NULL; }
現在短篇小說:
- 涉及正則表達式的實現(因爲它支持很多功能,如Unicode案例摺疊)
src/regexp.c
的實現運行5966 LoC(7652包括註釋和空白)
但是,如果您正在尋找'複雜'的算法(例如, Boyer Moore)你不會找到它,因爲坦率地說,在一個文件中查找文本並不需要它。基於vim-7.3.547
在debian
現在,如果你想看看最高性能的搜索算法,你可能想看看GNU grep
的來源,而不是... :)
所有計數軟件包檔案
相關問題
- 1. 如何在vi編輯器中搜索文本後襬脫棕色背景
- 2. C#瀏覽器搜索功能(編輯)
- 3. JavaScript表格排序功能背後的邏輯是什麼?
- 4. 有沒有辦法在vi中編輯最後的搜索/替換模式?
- 5. Random.next()背後的算法是什麼?
- 6. Robocopy背後的算法是什麼?
- 7. 色輪背後的算法是什麼?
- 8. Gimp的「Color to Alpha」功能背後有什麼算法?
- 9. Aptana + GVIM =>在Aptana中集成vi編輯器的功能
- 10. 傅立葉分割算法背後的邏輯是什麼?
- 11. 堆棧溢出的ajax標籤搜索字段背後的算法是什麼
- 12. 爲什麼在文本編輯器的查找功能中選擇「BM算法」而不是「星期日算法」?
- 13. Eclipse中「與編輯器鏈接」功能的作用是什麼?
- 14. Xcode Swift編輯器中的這種顏色功能是什麼?
- 15. 功能背後的邏輯
- 16. Kotlin Android擴展視圖背後的編輯魔法是什麼?
- 17. 什麼是Vi編輯器正則表達式?
- 18. 即時搜索功能是背後的一個按鍵
- 19. 搜索邏輯功能
- 20. 在VI編輯器中打開的文件中搜索指定的字
- 21. 分頁背後的邏輯是什麼?
- 22. Html.DisplayName背後的邏輯是什麼
- 23. Gridview:搜索後編輯
- 24. 搜索邏輯和算法
- 25. Perl中「系統」功能的背後是什麼?
- 26. vi編輯器:讀取
- 27. vi編輯器查詢
- 28. 如何在Solaris的vi編輯器中搜索多個字符串?
- 29. 在Android中關閉搜索對話框的功能是什麼?
- 30. 使用VI編輯器時,我的REGEX有什麼問題?