使用正则表达式从头开始匹配x个字符

时间:2011-07-05 17:57:06

标签: regex delphi

我试图用delphi重命名程序,并且需要知道是否可以使用正则表达式从头开始匹配一些指定数量的字符。

例如,如果字符串是FileName.txt并且特定数字是6 它应该与FileNa匹配

我还需要一个模式来匹配特定数字到结尾的字符串。

如果答案包含说明,我会很高兴,因为我想学习正则表达式编码。

2 个答案:

答案 0 :(得分:3)

^.{6}

将匹配前6个字符,但如果少于6个字符则不匹配。

^.{1,6}

将匹配前6个字符(最多6个字符),但如果字符串为空则不匹配。

.表示匹配任何字符(包括路径分隔符,在您的情况下)。如果您只想要字母,数字和下划线,则可以将.替换为\w

^\w{1,6}

答案 1 :(得分:2)

如果使用Delphi XE,则使用TRegEx类构建正则表达式功能。如果您使用的是早期版本的Delphi,可以在这里找到一个库,在那里您还可以找到有关Delphi XE支持的更多信息:http://www.regular-expressions.info/delphi.html

此正则表达式最多匹配6个字符,直到.将扩展名与文件名的其余部分分开。

^([^\.]{1,6})[^\.]*(?:\..*)?$

给出输入: FileName.txt
第1组将是: FileNa

给出输入: File.txt
第1组将是:文件

表达式使用分组来捕获前6个字符。 Delphi XE中的代码如下所示:

var
    Regex: TPerlRegEx;
    ResultString: string;

Regex := TPerlRegEx.Create;
try
    Regex.RegEx := '^([^\.]{1,6})[^\.]*(?:\..*)?$';
    Regex.Options := [];
    Regex.Subject := SubjectString;
    if Regex.Match then begin
        if Regex.GroupCount >= 1 then begin
            ResultString := Regex.Groups[1];
        end
        else begin
            ResultString := '';
        end;
    end
    else begin
        ResultString := '';
    end;
finally
    Regex.Free;
end;

例如文件名:FileName.txt将匹配: FileNa (组1)

我会尝试解释我使用的正则表达式,尽管可能有更好的表达式:

^ # Match beginning of line
( # Begin a group (enables us to capture the contents alone)
  [^\.] # Capture any character that is not a '.'
  {1,6} # Capture anything from 1 to 6 of these characters (6 if possible)
) # Close the group
[^\.] # Match any character that is not '.' (again)
* # Match this 0 or more times
(?: # Begin a group that we do not wish to capture
  \. # Capture the character '.' (the extension separator)
  .* # Capture any character 0 or more times
) # Close the group
? # Match this group 0 or 1 time (it is either there or not)
$ # Match the end of line

在问题的下一部分,创建一个模式以匹配特定数字的字符串到结尾:

^(?:.{6})?(.*)$

鉴于输入:这是一个测试
第1组将是:是一个测试

在此示例中,特定数字为 6 ,将其更改为您要查找的任何数字。我再次使用组来获取匹配文本的内容。第一组是无捕获组,这意味着我们对其内容不感兴趣,只是我们需要它在那里。如果我们仍在讨论文件名,您可以使用以下正则表达式:

^(?:[^\.]{6})([^\.]*)(?:\..*)?$

给出输入: FileName.txt
第1组将是: me

这是对第一个正则表达式的修改,其中我使第一个组没有捕获,告诉它长 6 个字符(再次改为适合你的任何数字)。并从捕获的文本中排除了扩展名。

请记住,正则表达式比阅读更容易编写。我总是发现:http://www.regular-expressions.info/是一个很好的信息来源,除了这本书给我带来了很多帮助:Mastering Regular Expressions