Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 Delphi-用户指定的字符串操作_Regex_String_Delphi - Fatal编程技术网

Regex Delphi-用户指定的字符串操作

Regex Delphi-用户指定的字符串操作,regex,string,delphi,Regex,String,Delphi,我在Delphi7有个问题。我的应用程序根据一套命名约定创建mpg视频文件,即 \000_A_Title_YYYY-MM-DD_HH-MM-ss_Index.mpg 在此文件名中,执行以下规则: 000是视频序列。每当用户按下stop时,它都会递增 A(或B、C、D)指定了录制摄像机-因此视频文件最多与四个同时播放的视频流链接 Title是长度可变的字符串。在我的应用程序中,它不能包含。 YYYY-MM-DD_HH-MM-ss是视频序列的开始时间(不是单个文件) 索引是基于零的排序索引,在1个视

我在Delphi7有个问题。我的应用程序根据一套命名约定创建mpg视频文件,即

\000_A_Title_YYYY-MM-DD_HH-MM-ss_Index.mpg

在此文件名中,执行以下规则:

000
是视频序列。每当用户按下stop时,它都会递增

A
(或B、C、D)指定了录制摄像机-因此视频文件最多与四个同时播放的视频流链接

Title
是长度可变的字符串。在我的应用程序中,它不能包含

YYYY-MM-DD_HH-MM-ss
是视频序列的开始时间(不是单个文件)

索引
是基于零的排序索引,在1个视频序列中递增。也就是说,视频文件的最长长度为15分钟,一旦达到该长度,将使用相同的序列号启动新的视频文件,但使用下一个索引。使用它,我们可以计算文件的实际开始时间
(文件名解码时间+15*索引)

使用此方法,我的应用程序可以提取视频文件开始录制的开始时间

现在我们有一个进一步的要求来处理任意命名的视频文件。我唯一能确定的是,文件名中的某个地方会有YYYY-MM-DD HH-MM ss

如何允许用户为其导入的文件指定文件名约定?比如正则表达式?我知道命名方案一定有一个模式

因此,如果用户在文本框中输入
?uu(摄像头)*\uyyyy-MM-DD\uhh-MM-ss_u(索引).mpg
,我将如何获取开始时间?有更好的解决办法吗?还是我们遇到每一种可能性时我都要处理


(我知道这可能不是处理此类问题的最佳方式,但我们无法改变问题-新的视频文件由另一家公司录制)

我不确定您是否试图将用户输入解析为组件“?(摄像头)*_YYYY-MM-DD_HH-MM-ss(Index).mpg`,但如果您只是试图获取类似的日期和时间,日期在组1中,时间在组2中

(\d{4}-\d{2}-\d{2}){(d{2}-\d{2}-\d{2})


否则,您无法确定您要做什么。

可能您可以使用下划线“\u1”作为位置指示器,因为您很聪明地不允许它们出现在标题中

在您的文件名约定示例中:

?_(Camera)_*_YYYY-MM-DD_HH-mm-ss_(Index).mpg 
您可以分析此用户指定的字符串,以查看日期YYYY-MM-DD始终在第3和第4个下划线之间,时间HH-MM-ss始终在第4和第5个下划线之间


然后,在按照此约定获取实际文件名时,找到第三个下划线并知道日期和时间就变得很简单了。

如果您想全天候拨打电话,那么您应该使用RegEx,让用户在TEdit中自由输入一些加密

如果你想要快乐的用户和一个良好的睡眠,那么就要有创意,放弃枯燥的正则表达式方法。使用愤怒的小鸟方法创建自己的文件名解码器

我的想法是:

  • 创建一些具有不同字符串操纵个性的鸟
  • 让用户选择并排列这些鸟
  • 执行用户生成的字符串操作
示例代码:

program AngryBirdFilenameDecoder;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure PerformEatUntilDash(var aStr: String);
begin
  if Pos('-', aStr) > 0 then
    Delete(aStr, 1, Pos('-', aStr));
  WriteLn(':-{   >   ' + aStr);
end;

procedure PerformEatUntilUnderscore(var aStr: String);
begin
  if Pos('_', aStr) > 0 then
    Delete(aStr, 1, Pos('_', aStr));
  WriteLn(':-/   >   ' + aStr);
end;

function FetchDate(var aStr: String): String;
begin
  Result := Copy(aStr, 1, 10);
  Delete(aStr, 1, 10);
  WriteLn(':-)   >   ' + aStr);
end;



var
  i: Integer;
  FileName:      String;
  TempFileName:  String;
  SelectedBirds: String;
  MyDate:        String;
begin
  Write('Enter a filename to decode (eg. ''01-ThisIsAText-Img_01-Date_2011-03-08.png''): ');
  ReadLn(FileName);
  if FileName = '' then
    FileName := '01-ThisIsAText-Img_01-Date_2011-03-08.png';



  repeat
    TempFileName := FileName;
    WriteLn('Now, select some birds:');
    WriteLn('Bird No.1  :-{  ==> I''ll eat letters until I find a dash (-)');
    WriteLn('Bird No.2  :-/  ==> I''ll eat letters until I find a underscore (_)');
    WriteLn('Bird No.3  :-)  ==> I''ll remember the date before I eat it');
    WriteLn;
    Write('Chose your birds: (eg. 112123):');
    ReadLn(SelectedBirds);
    if SelectedBirds = '' then
      SelectedBirds := '112123';

    for i := 1 to Length(SelectedBirds) do
    case SelectedBirds[i] of
      '1': PerformEatUntilDash(TempFileName);
      '2': PerformEatUntilUnderscore(TempFileName);
      '3': MyDate := FetchDate(TempFileName);
    end;


    WriteLn('Bird No.3 found this date: ' + MyDate);
    WriteLn;
    WriteLn;
    Write('Check filename with some other birds? (Y/N): ');
    ReadLn(SelectedBirds);
  until (Length(SelectedBirds)=0) or (Uppercase(SelectedBirds[1])<>'Y');
end.
程序AngrybirdFileName解码器;
{$APPTYPE控制台}
使用
SysUtils;
过程performationUntildash(变量aStr:String);
开始
如果Pos('-',aStr)>0,则
删除(应科院,1,位置"-",应科院);;
WriteLn(':-{>'+aStr);
结束;
程序性能UntilunderScore(var aStr:字符串);
开始
如果位置(“”,aStr)>0,则
删除(应科院,1号,位置(“应科院”);
WriteLn(':-/>'+aStr);
结束;
函数FetchDate(var aStr:String):String;
开始
结果:=复印件(aStr,1,10);
删除(应科院第1、10号);
WriteLn(':-)>'+aStr);
结束;
变量
i:整数;
文件名:字符串;
TempFileName:字符串;
精选鸟类:字符串;
MyDate:字符串;
开始
写入('输入要解码的文件名(例如'01-ThisIsAText-Img_01-Date_2011-03-08.png'):');
ReadLn(文件名);
如果文件名='',则
文件名:=“01-ThisIsAText-Img_01-Date_2011-03-08.png”;
重复
TempFileName:=文件名;
WriteLn('现在,选择一些鸟:');
WriteLn('Bird No.1:-{==>我会吃字母直到找到破折号(-));
WriteLn('Bird No.2:-/==>我会吃掉字母,直到我找到下划线());
WriteLn('Bird No.3:-)=>我会在吃之前记住日期);
书面语;
写(‘选择你的鸟:(如112123):’);
ReadLn(选择的鸟类);
如果选择了birds='',则
精选鸟类:='112123';
对于i:=1到长度(SelectedBirds)do
案例选择鸟类[i]
“1”:performationUntildash(TempFileName);
“2”:PerformeUntilunderScore(TempFileName);
“3”:MyDate:=FetchDate(TempFileName);
结束;
WriteLn('Bird No.3发现此日期:'+MyDate);
书面语;
书面语;
写入('与其他鸟一起检查文件名?(Y/N):');
ReadLn(选择的鸟类);
直到(长度(SelectedBirds)=0)或(大写(SelectedBirds[1])Y');
结束。
当你在Delphi中用GUI做这件事时,你会添加更多的鸟,当然也会进行更多的检查,并找到一些漂亮的鸟字形

使用两个列表框。一个位于左侧,包含所有可能的鸟类,另一个位于右侧,包含所有选定的鸟类。从左到右拖放鸟类。重新排列(并删除)右侧列表中的鸟类


用户应该能够通过输入文件名来测试设置,并查看过程的结果。在内部,您可以使用枚举器等存储脚本。

Ok,因此我以前没有在Delphi中使用正则表达式,因为Delphi7本身不支持它。那么使用Regex是一种可行的方法吗?对于较旧的Delphi版本,有Regex组件我用了,但还有很多。谢谢David-我会考虑另一个想法: