C# 验证百分比的正则表达式

C# 验证百分比的正则表达式,c#,regex,C#,Regex,我想验证输入字符串,以便 5.0 is correct 5.5% is correct 因此,我从以下代码开始: string decimalstring1 = "10000.55"; string decimalstring2 = "5%5%"; string expression = @"^\d|\d%"; Regex objNotNumberPattern = new Regex(expression); Console.WriteLine(objNotNumberPatte

我想验证输入字符串,以便

5.0  is correct 
5.5% is correct 
因此,我从以下代码开始:

string decimalstring1 = "10000.55";
string decimalstring2 = "5%5%";

string expression = @"^\d|\d%";

Regex objNotNumberPattern = new Regex(expression);

Console.WriteLine(objNotNumberPattern.IsMatch(decimalstring1));
Console.WriteLine(objNotNumberPattern.IsMatch(decimalstring2));
Console.ReadLine();
但问题是,输入值为5%5%时,它会给出
correct


如何修改此表达式以使其生效?

您将获得部分匹配,因为您的表达式不会锚定两侧。你的正则表达式锚定比赛的开始,但不是结束

此外,左锚点
^
的位置不正确,因为它仅适用于左子表达式

在末尾添加一个
$
将有助于:

^(\d|\d%)$
但是,这是次优的:由于两个表达式的前缀相同,并且它们的不同之处在于可选的后缀
%
,因此可以使用
%?
简化表达式:

^\d+%?$
这样更好,但与小数点不匹配。要添加此功能,请按如下所示更改表达式:

^(\d+|\d*[.]\d+)%?$

表达式如下所示:当您找到以下任一项时匹配:输入字符串开头的一个数字,或任何位置的一个数字,后跟%。可能不是你想要的。我想试试这样的东西:

var expression = @"^\d+(\.\d+)?%?$";

这将转换为:匹配字符串开头的正数数字,可选后跟一个点和任意数量的数字(小数部分),可选以%符号结尾。

您可以尝试此
^\d+([.]\d+?%?$,
它的工作原理是:(已测试)

希望有帮助

string[] inputs = new string[] {
    "1000.55",
    "1000.65%",
    "100",
    "100%",
    "1400%",
    "5.5",
    "5.5%",
    "x",
    ".%"
};

string expression = @"^\d+[.]?\d*%?$";

Regex objNotNumberPattern = new Regex(expression);
foreach (var item in inputs)
Console.WriteLine(objNotNumberPattern.IsMatch(item));
更新

string expression = @"^(\d+|\d+[.]\d+)%?$";

我认为这是最好的:

^\d{0,2}(\.\d{1,4})? *%?$
来源:

这对我来说很有效:

/(^100([.]0{1,2})?)$|(^\d{1,2}([.]\d{0,2})?)$/

对于只有两个小数且不超过100[0.00-100.00]

的情况,这与
X
(或任何其他单个字符)匹配。很抱歉,我忘了将点反斜杠!现在应该可以了。谢谢你的建议。更好,但它仍然会匹配,例如
%
(除非是有意的)好的,再次更改它,现在不匹配
%
。再次感谢@decpl乐于助人,一个人每天都在学习。顺便说一句-
+
{1,}
的简写。在学习过程中,我强烈推荐一些可视化工具,它可以动态地向您展示正在发生的事情。就我个人而言,我使用在线工具,如Regexero或debuggex。你的表情告诉我你正在独立地匹配每个数字,这会给你一个线索。@Tarec哇,这是一个测试正则表达式的令人印象深刻的网站!谢谢你的参考@Tarec你能定义一个不必要的组吗?我要反驳的是,
|
替代方案会创建不必要的部分重复以匹配第一个数字,这在任何比单个\d+更复杂的情况下都可能变得难以维护。谢谢你知道如何在不使用percentageExtract的情况下提取小数部分吗?Mmm可能使用groups.if(Decimal.TryParse(s_input.Replace(“%”),out d_input)){decimalPart=d_input-(int)d_input;}
/(^100([.]0{1,2})?)$|(^\d{1,2}([.]\d{0,2})?)$/