Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用模式作为文件名执行文件_Regex_Delphi_Pattern Matching - Fatal编程技术网

Regex 使用模式作为文件名执行文件

Regex 使用模式作为文件名执行文件,regex,delphi,pattern-matching,Regex,Delphi,Pattern Matching,作为我的应用程序的一部分,我需要让用户能够从我的应用程序中执行文件(视频),但问题是,应用程序没有在应用程序本身的任何位置存储这些文件的列表,关于该文件的唯一已知信息是它所在的目录,并且它必须匹配特定的模式,如下所示:*-Ep[0-99]-*其中,*字符表示任何长度的任何字符串、整数、unicode字符等,Ep&-是字符串文字,最后,[0-99]是介于0和99之间的任何整数值 这听起来像是正则表达式的完美工作,但问题是正则表达式需要提前匹配字符串才能找到匹配项,如前所述,应用程序不会将此字符串存

作为我的应用程序的一部分,我需要让用户能够从我的应用程序中执行文件(视频),但问题是,应用程序没有在应用程序本身的任何位置存储这些文件的列表,关于该文件的唯一已知信息是它所在的目录,并且它必须匹配特定的模式,如下所示:
*-Ep[0-99]-*
其中,
*
字符表示任何长度的任何字符串、整数、unicode字符等,
Ep
&
-
是字符串文字,最后,
[0-99]
是介于0和99之间的任何整数值

这听起来像是正则表达式的完美工作,但问题是正则表达式需要提前匹配字符串才能找到匹配项,如前所述,应用程序不会将此字符串存储在任何位置,因此除非我首先使用类似于
FindFirst
的函数来搜索文件所在的目录,然后对其进行迭代,将每个文件名加载到RegEx可以匹配的变量中,否则使用RegEx将无法工作,但如果有更好的选择,我宁愿避免这样做


为了完成这项任务,我还研究了
MatchesMask
函数,但它也遇到了使用正则表达式所遇到的问题,因此,我希望您能提供一些建议或我前面提到的方法的替代方法。

枚举目录的内容是不可能的。如果出于未知原因必须避免这种情况,那么您唯一剩下的选择就是猜测文件名。如果您希望找到所有文件名,那么您需要尝试与您的模式匹配的所有可能的文件名。这是不容易处理的。太多了

这让我们回到
FindFirst
或其他一些目录枚举方案。我个人会直接使用
FindFirst
。它很容易调用,而且效率很高。在伪代码中:

retval := FindFirst(TPath.Combine(dir, '*'), 
  faAnyFile and not faDirectory, searchRec);
if retval = 0 then
  try
    repeat
      filename := TPath.Combine(dir, searchRec.Name);
      if MatchesRegex(filename) then
        DoStuff(filename);
    until FindNext(searchRec) <> 0;
  finally
    FindClose(searchRec);
  end;
retval:=FindFirst(TPath.Combine(dir,'*'),
faAnyFile而非faDirectory、searchRec);
如果retval=0,则
尝试
重复
文件名:=TPath.Combine(dir,searchRec.Name);
如果匹配regex(文件名),则
DoStuff(文件名);
直到FindNext(searchRec)0;
最后
FindClose(searchRec);
结束;

无需避免读取文件名。您可以使用TDirectory.GetFiles代替FindFirst/Next。。(内部使用FindFirst,…。
t目录.GetFiles()
迭代整个目录,(效率低下)分配并返回找到的文件名数组。直接调用
Find(First | Next)(
可以在迭代时处理文件名。因此,这实际上取决于您需要对文件做什么,存在多少文件,您愿意使用多少内存,等等。设计
系统.IOUtils
单元的人并没有很好地使用它。是的,TDirectory.GetFiles使用起来有点方便(尽管它使用了讨厌的TStringDynArray,eiugh),但性能非常糟糕。任何有经验的程序员都会对它的实现感到畏缩,因此Emba的代码审查政策可能是宽松的。您可以在应用程序首次开始创建匹配文件列表时进行此处理,然后设置目录更改通知(例如添加/删除或重命名文件)并评估是否需要修改列表。MSDN on changenotification:如果您安装了JVCL:或者您可以使用此组件:@user如果您信任不可靠的更改通知,则不能说明更改通知的可靠性,可以说我使用了更改通知,并且从来没有任何问题。@user它被记录为不可靠您可以添加到“被记录为不可靠”的链接吗这是微软自己说的,还是你指的是向MSDN链接添加评论的那个人?