Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Delphi 2010 - Fatal编程技术网

Regex 使用独特的路径或输入键的优雅方式

Regex 使用独特的路径或输入键的优雅方式,regex,delphi,delphi-2010,Regex,Delphi,Delphi 2010,我有一个加载CAD数据(自定义格式)的应用程序,可以从指定图形绝对路径的本地文件系统加载,也可以从数据库加载 数据库访问通过以图纸标识符为参数的库函数实现 标识符的格式类似于ABC 01234T56-T,而我的路径是典型的windows路径(例如x:\Data\cadfiles\cadfile001.bin) 我想编写一个包装函数,将字符串作为参数,它可以是一个路径,也可以是一个标识符,用于调用适当的函数来加载数据 像这样: Function CadLoader(nameOrPath : Str

我有一个加载CAD数据(自定义格式)的应用程序,可以从指定图形绝对路径的本地文件系统加载,也可以从数据库加载

数据库访问通过以图纸标识符为参数的库函数实现

标识符的格式类似于ABC 01234T56-T,而我的路径是典型的windows路径(例如
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()
和类似函数有一个警告:在多任务系统中使用非原子操作本质上很容易失败。调用可能会在创建或删除文件之前返回,在这两种情况下,结果都是错误的。因此,简单地尝试打开文件(并处理异常)会更好。顺便说一句,数据库访问也是如此,除非使用显式事务。因此,我将尝试两种访问,以降低可能性或成本的顺序,并且只有在两种访问都失败时才会引发异常。