gpt4 book ai didi

regex - 正则表达式和 TMatch.Groups.Count

转载 作者:行者123 更新时间:2023-12-03 15:27:19 26 4
gpt4 key购买 nike

我正在从 Apache Commons 库移植一些类,我发现以下行为很奇怪。我有一个正则表达式定义为

const
IPV4_REGEX = '^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$';

我按如下方式使用它:

ipv4Validator: TRegEx; 

ipv4Validator := TRegEx.Create(IPV4_REGEX);

当我使用它来匹配 IP 地址时,以下代码返回 false - 调试器显示 Match.Groups.Count 为 5,这是我没想到的。

var
Match: TMatch;
begin
Match := ipv4Validator.Match(inet4Address);

if Match.Groups.Count <> 4 then
Exit(false);

这是 TMatch.Groups.Count 的正确行为吗?

<小时/>

为了以防万一,这是我类(class)的完整代码。请注意,我已经评论了有问题的行,因为它使我的测试失败。

unit InetAddressValidator;

interface

uses RegularExpressions;

const
IPV4_REGEX = '^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$';

type

TInetAddressValidator = class
private
ipv4Validator: TRegEx;
public
constructor Create; overload;
function isValid(const inetAddress: String): Boolean;
function isValidInet4Address(const inet4Address: String): Boolean;
end;

implementation

uses SysUtils;

constructor TInetAddressValidator.Create;
begin
inherited;
ipv4Validator := TRegEx.Create(IPV4_REGEX);
end;

function TInetAddressValidator.isValid(const inetAddress: String): Boolean;
begin
Result := isValidInet4Address(inetAddress);
end;

function TInetAddressValidator.isValidInet4Address(const inet4Address
: String): Boolean;
var
Match: TMatch;
IpSegment: Integer;
i: Integer;
begin
Match := ipv4Validator.Match(inet4Address);

// if Match.Groups.Count <> 4 then
// Exit(false);

IpSegment := 0;
for i := 1 to Match.Groups.Count - 1 do
begin
try
IpSegment := StrToInt(Match.Groups[i].Value);
except
Exit(false);
end;

if IpSegment > 255 then
Exit(false);
end;
Result := true;
end;

end.

最佳答案

Match.Groups[0] 包含整个表达式,因此这是正确的。

TGroupcollection 构造函数:

constructor TGroupCollection.Create(ARegEx: TPerlRegEx;
const AValue: UTF8String; AIndex, ALength: Integer; ASuccess: Boolean);
var
I: Integer;
begin
FRegEx := ARegEx;
/// populate collection;
if ASuccess then
begin
SetLength(FList, FRegEx.GroupCount + 1);
for I := 0 to Length(FList) - 1 do
FList[I] := TGroup.Create(AValue, FRegEx.GroupOffsets[I], FRegEx.GroupLengths[I], ASuccess);
end;
end;

正如您所看到的,内部 Flist ( TArray<TGroup> ) 以组数 + 1 启动。FList[0] 接收偏移量为 1 和整个表达式长度的组。此行为没有记录。

关于regex - 正则表达式和 TMatch.Groups.Count,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15362556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com