我需要一个正则表达式,它将指定位置的字符串与第一个字符相反地匹配。字符串是一些文件名。
您可以按照以下步骤从“New Document.extension”获取“New docu”:
对于“This Is My Longest Document.ext1.ext2”示例:
答案 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+
。