使用正则表达式反向匹配字符

时间:2011-07-15 17:50:15

标签: regex delphi

我需要一个正则表达式,它将指定位置的字符串与第一个字符相反地匹配。字符串是一些文件名。

  • 我正在使用Delphi 2010
  • 我的示例字符串是New Document.extension
  • 如果指定的位置为4,则应匹配: 新文件

您可以按照以下步骤从“New Document.extension”获取“New docu”:

  • 首先剥离扩展名。你最终得到了“新文件”
  • 删除最后4个字符。你得到“新纪录片”。

对于“This Is My Longest Document.ext1.ext2”示例:

  • 剥离扩展程序,最终得到:“这是我最长的Document.ext1”
  • 删除最后4个字符。你得到:“这是我最长的文件。”

4 个答案:

答案 0 :(得分:5)

所以你希望整个字符串在最后一个点之前到达倒数第四个位置?没问题:

Delphi .NET:

ResultString := Regex.Match(SubjectString, '^.*(?=.{4}\.[^.]*$)').Value;

<强>解释

^       # Start of string
.*      # Match any number of characters
(?=     # Assert that it's possible to match, starting at the current position:
 .{4}   # four characters
 \.     # a dot (the last dot in the string!) because...
 [^.]*  # from here one only non-dots are allowed until...
 $      # the end of the string.
)       # End of lookahead.

答案 1 :(得分:4)

由于我不能发布正则表达式因为我提出了与Tim完全相同的正则表达式,所以我将发布一段完全相同的程序代码。

function FileNameWithoutExtension(const FileName:string; const StripExtraNumChars: Integer): string;
var i: Integer;
begin
  i := LastDelimiter('.', FileName); // The extension starts at the last dot
  if i = 0 then i := Length(FileName) + 1; // Make up the extension position if the file has no extension
  Dec(i, StripExtraNumChars + 1); // Strip the requested number of chars; Plus one for the dot itself
  Result := Copy(FileName, 1, i); // This is the result!
end;

答案 2 :(得分:3)

你接受了给出正则表达式

的答案
  

整个字符串直到最后一个点之前的第四个到最后一个位置。

如果这就是你想要的,那么你没有正则表达式就能做到最好:

procedure RemoveExtensionAndFinalNcharacters(var s: string; N: Integer);
begin
  s := ChangeFileExt(s, '');//remove extension
  s := Copy(s, 1, Length(s)-N);//remove final N characters
end;

这比正则表达式更有效,更重要的是,它更清晰,更易于理解。

正则表达不是唯一的成果。

答案 3 :(得分:0)

根据评论进行修改

我不确定Delphi是如何进行正则表达式的,但这在大多数系统中都有效。

^.*(?=.{4}\.\w+$)

^                #the start of the string
.*               #Any characters.
(?=              #A lookahead meaning followed by...
.{4}             #Any 4 chars.
\.               #A literal .
\w+              #an actual extension.
$                #the end of the string
)                #closing the lookahead

如果你想确保扩展名为三个字符长,你最后也可以使用\w{3}$而不是\w+