使用TRegEx在Delphi中创建正则表达式
我希望在Delphi XE中创建一个正则表达式,该表达式将匹配一个数字,后跟一个小数点,后跟(基本上)无限位数 有效例子: 无效示例: 小数点可以是可选的,整数也可以 如何使用TRegEx在Delphi中实现这一点 编辑: 这就是我迄今为止所做的:使用TRegEx在Delphi中创建正则表达式,regex,delphi,Regex,Delphi,我希望在Delphi XE中创建一个正则表达式,该表达式将匹配一个数字,后跟一个小数点,后跟(基本上)无限位数 有效例子: 无效示例: 小数点可以是可选的,整数也可以 如何使用TRegEx在Delphi中实现这一点 编辑: 这就是我迄今为止所做的: enter function CheckCoefficientBoxesValidInput(InputtedTerm : TEdit) : boolean; var RegularExpression : TRegEx; Match :
enter function CheckCoefficientBoxesValidInput(InputtedTerm : TEdit) : boolean;
var
RegularExpression : TRegEx;
Match : TMatch;
begin
RegularExpression.Create('[-+]?[0-9]*\.?[0-9]+');
Match := RegularExpression.Match(InputtedTerm.Text);
if Match.Success then
begin
ShowMessage('Success.');
end;
end;
编辑2:
正在尝试@DavidHeffernan的代码:
Function CheckCoefficientBoxesValidInput(InputtedTerm : TEdit) : boolean;
var
RegularExpression : TRegEx;
Match : TMatch;
begin
CheckCoefficientBoxesValidInput := true;
if not RegularExpression.IsMatch(InputtedTerm.Text, '[-+]?[0-9]*\.?[0-9]+') then
CheckCoefficientBoxesValidInput := false;
end;
不幸的是,这似乎不起作用。您可能也想要考虑一个符号,以允许负数。这应该可以 [-+]?[0-9]*\.?[0-9]+ 测试这样的匹配:
TRegEx.IsMatch(Input, '^\s*[-+]?[0-9]*\.?[0-9]+\s*$')
示范:
{$APPTYPE CONSOLE}
uses
System.RegularExpressions;
procedure Check(const Input: string);
begin
Writeln(Input, ' ', TRegEx.IsMatch(Input, '^\s*[-+]?[0-9]*\.?[0-9]+\s*$'));
end;
begin
Check('2.334');
Check('150.2');
Check('0.23');
Check('3');
Check('3..42');
Check('4-2.3');
Check('e5.64');
Check('3 145');
end.
输出
2.334 TRUE
150.2 TRUE
0.23 TRUE
3 TRUE
3..42 FALSE
4-2.3 FALSE
e5.64 FALSE
3 145 FALSE
2.334正确
150.2正确
0.23对
3正确
3..42错误
4-2.3错误
e5.64错误
3145错误
Delphi正则表达式的参考信息如下:
以及Delphi正则表达式类的文档:
只要调用
TryStrToFloat
就容易多了 我知道所有的酷孩子都喜欢正则表达式,但我认为,如果一个非常简单的验证程序就能完成这项工作(而且在未来的几个月/几年内更容易理解),那么解决这类问题就太过分了
大致如下:
function IsValidNumber(s: String): Boolean;
var
parts: TStringDynArray;
begin
parts := SplitString(s, '.');
case Length(parts) of
1: result := StrToIntDef(s, -1) <> -1;
2: result := (StrToIntDef(parts[0], -1) <> -1)
and (StrToIntDef(parts[1], -1) <> -1);
else
result := FALSE;
end;
end;
您可以提供一个模板数组和一个候选字符串来匹配这些模板。第一场比赛“获胜”,返回TRUE。如果没有匹配项,则返回FALSE。如果字符串与模板匹配,您可以选择将变量部分捕获到名称/值对列表中(必须提供的TStringList)。因此,鉴于这些呼吁:
TStringTemplate.Match(['[whole:int]', '[whole:int].[decimal:int]'], '42', list);
TStringTemplate.Match(['[whole:int]', '[whole:int].[decimal:int]'], '3.14159', list);
在每种情况下,列表将包含:
[0] whole=42
及
如果变量部分未命名,则只需按照匹配值中变量出现的顺序将相应变量作为值添加到列表中:
TStringTemplate.Match(['[whole:int]', '[:int].[:int]'], '3.14159', list);
将产生以下列表:
[0] 3
[1] 14159
不幸的是,我目前无法发布这个类,因为它反过来又依赖于我自己的字符串库,在我的github repo发布之前,这个字符串库正在经历一次重大的检修。但是如果你感兴趣,我会让你知道它什么时候准备好(v.很快),或者你可以这样做。那正则表达式呢
-?\d+(\.\d+)?
此外,如果您想验证带有尾数的浮点数,请使用:
-?\d+([\.|e\-]+\d+)?
适用于3.14、-3.14、-3e14、3e-14、-3e-14。并适用于错误字符串,如3.e-14
因此,这是一个更高级的表达式,工作时不会出错:
-?\d*\.?\d+([eE]\-?\d+)?
你看过文件了吗?您的问题是如何编写执行正则表达式的代码,还是要求使用正确的正则表达式?您尝试了什么?请参阅我在上面所做的编辑。
RegularExpression.Create()
必须是RegularExpression:=TRegEx.Create()
您还可以查找“.”的外观两次以上。像AnsiPos('.',Copy(string,AnsiPos('.',string)+1,length(string));以防您没有字母。:)@CiucaS句点只能匹配0或1次。他在我所指的示例“3..42”中张贴了该句点。@CiucaS该句点不能匹配该句点pattern@DavidHeffernan见上文。我不相信发明非标准的regex替代品是一个好主意。如果模式匹配是你想要的,那么正则表达式有什么不好?在这种情况下,调用TryStrToFloat
在一定程度上是最好的方法。虽然w.r.t TryStrToFloat(),但“规范”似乎排除了许多有效浮点数的输入(科学符号、有符号值)。这可能是“规范”中的一个疏忽,但它是规范。我的StringTemplate类并不是regex的替代品,它只解决了regex解决的问题的一个子集,但做得更简单(imho)。i、 以一种任何人都能理解的方式,不仅仅是那些生活、饮食和呼吸正则表达式密码的人(他们中的许多人总是搞砸他们的正则表达式,这本身就说明了很多关于正则表达式imho的事情)。我无法理解你的模式匹配语言。不过我懂正则表达式。我已经知道正则表达式了。这是标准的一个优点。是的,我猜规范是不精确的,因为提问者还在工作,这是一个学校项目。顺便说一句,我真的很高兴你最近对SO的贡献。我喜欢你在这里做的工作。大量的解释、推理和散文,而不是像我们在这里看到的那样,“尝试这段代码”。
TStringTemplate.Match(['[whole:int]', '[:int].[:int]'], '3.14159', list);
[0] 3
[1] 14159
-?\d+(\.\d+)?
-?\d+([\.|e\-]+\d+)?
-?\d*\.?\d+([eE]\-?\d+)?