Regex 使用独特的路径或输入键的优雅方式
我有一个加载CAD数据(自定义格式)的应用程序,可以从指定图形绝对路径的本地文件系统加载,也可以从数据库加载 数据库访问通过以图纸标识符为参数的库函数实现 标识符的格式类似于ABC 01234T56-T,而我的路径是典型的windows路径(例如Regex 使用独特的路径或输入键的优雅方式,regex,delphi,delphi-2010,Regex,Delphi,Delphi 2010,我有一个加载CAD数据(自定义格式)的应用程序,可以从指定图形绝对路径的本地文件系统加载,也可以从数据库加载 数据库访问通过以图纸标识符为参数的库函数实现 标识符的格式类似于ABC 01234T56-T,而我的路径是典型的windows路径(例如x:\Data\cadfiles\cadfile001.bin) 我想编写一个包装函数,将字符串作为参数,它可以是一个路径,也可以是一个标识符,用于调用适当的函数来加载数据 像这样: Function CadLoader(nameOrPath : Str
x:\Data\cadfiles\cadfile001.bin
)
我想编写一个包装函数,将字符串作为参数,它可以是一个路径,也可以是一个标识符,用于调用适当的函数来加载数据
像这样:
Function CadLoader(nameOrPath : String):TCadData;
我的问题:我如何才能优雅地决定我的字符串是idnetifier还是文件路径?
使用regexp?或者只搜索标识符中没有出现的“\”和“:”?在我看来,K.I.S.S.原则适用(或者保持简单愚蠢!)。听起来很刺耳,但是如果您绝对确定组合
:\
永远不会出现在您的标识符中,我只会在字符串的第二个位置查找它。使事情易懂易读。还有一句话:
有些人在面对
问题,想想“我知道,我会用
正则表达式。”现在他们有了
两个问题杰米·扎温斯基
试试这个
Function CadLoader(nameOrPath : String):TCadData;
begin
if FileExists(nameOrPath) then
<Load from file>
else
<Load from database>
end;
函数CadLoader(nameOrPath:String):TCadData;
开始
如果文件存在(名称或路径),则
其他的
终止
我会这样做:
function CadLoader(nameOrPath : String) : TCadData;
begin
if ((Pos('\\',NameOrPath) = 1) {UNC} or (Pos(':\',NameOrPath) = 2) { Path })
and FileExists(NameOrPath) then
begin
// Load from File
end
else
begin
// Load From Name
end;
end;
执行相同操作的正则表达式是:
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
type
CadLoadType = (CadFromPath, CadFromDatabase);
Function CadLoader(aType: CadLoadType; const aIdentifier: String): TCadData;
begin
case aType of
CadFromPath: begin
// aIdentifier is a file path...
end;
CadFromDatabase: begin
// aIdentifier is a database ID ...
end;
end;
end;
然后你可以这样做:
Cad := CadLoader(CadFromFile, 'x:\Data\cadfiles\cadfile001.bin');
Cad := CadLoader(CadFromDatabase, 'ABC 01234T56-T');
还有一种说法是,让事情尽可能简单,但不要再简单了。首先,对于UNC路径,您的解决方案将失败。这肯定会起作用,但当数据库标识符与文件路径相比相对容易识别时,对FileExists()的自动调用不会导致不必要的异常/故障情况吗?或者我过早地进行了优化?FileExists()
和类似函数有一个警告:在多任务系统中使用非原子操作本质上很容易失败。调用可能会在创建或删除文件之前返回,在这两种情况下,结果都是错误的。因此,简单地尝试打开文件(并处理异常)会更好。顺便说一句,数据库访问也是如此,除非使用显式事务。因此,我将尝试两种访问,以降低可能性或成本的顺序,并且只有在两种访问都失败时才会引发异常。