Regex Delphi-用户指定的字符串操作
我在Delphi7有个问题。我的应用程序根据一套命名约定创建mpg视频文件,即 \000_A_Title_YYYY-MM-DD_HH-MM-ss_Index.mpg 在此文件名中,执行以下规则: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个视
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-我会考虑另一个想法: