regex - 如何高效实现.*a.*b.*这样的正则表达式?

标签 regex algorithm performance

我想匹配像 Colibri 这样的文件名做。我尝试用正则表达式来解决。

在 Colibri 中搜索的工作原理是,您在文件名中键入按顺序排列的字符,它会在文件名中按顺序查找所有具有这些字符的文件。例如,对于“ab”,它会找到“cabal”、“ab”和“achab”。

在字母之间简单插入 .* 是可行的(所以搜索字符串“ab”变成了正则表达式 .*a.*b.*),但我想它在大量文件上。

到目前为止,我有 O(N*???),其中 N 是文件名的数量,而 ???充其量是线性复杂度(我假设我的语言使用 NFA)。我不太关心空间复杂性。我应该选择什么样的数据结构或算法来提高效率(时间复杂度)?

最佳答案

如果您只想检查搜索字符串 search 中的字符是否以相同的顺序包含在另一个字符串 str 中,您可以使用这个简单的算法:

pos := -1
for each character in search do
    pos := indexOf(str, character, pos+1)
    if pos is -1 then
        break
    endif
endfor
return pos

此算法返回 strsearch 最后一个字符的偏移量,否则返回 -1。它的运行时间为 O(n)(您可以用一个简单的 indexOf 循环替换 while,该循环比较 str 中的字符与 pos 到 Length(str)-1 并返回偏移量或 -1。

关于regex - 如何高效实现.*a.*b.*这样的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750398/

相关文章:

c++ - 找到最小的整数,其数字的平方和与给定的数字相加

c - 连续运行应用程序

regex - 在输出中查找并替换为正则表达式

python - 正则表达式使用 python 从文件中过滤和删除特定的多行文本

arrays - 在 o(1) 的整数数组中查找 i 和 j 之间的元素数

关于使用堆栈将递归转换为迭代的困惑

python - 不允许空格作为最后一个字符

regex - 如何格式化文本字段javafx

javascript - 随机化数组中的元素?

C# Parallel.For 创建数组 : OK to put lock() on the array?