我想要一个正则表达式,它在文本框按键事件中采用以下十进制值
条件
可能的格式是,
等
或
正则表达式,不包括逗号复杂度(仅满足条件1和2),我可以在代码中处理。我尝试了几个正则表达式,但找不到我需要的确切表达式。
我尝试了以下代码,但它在我的keydown事件中无效。
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
bool isMatch = Regex.IsMatch(textBox1.Text,@"^(?!.*[\w-[\d]])
(?=[\d.,]{0,12})
(?=,{0,2})
(?=\.{0,1})
[\s\d]
[\d,]{0,8}
.?
\d{0,2}
\s?
$");
if (!isMatch)
{
e.Handled = e.Key != Key.Back;
}
}
答案 0 :(得分:0)
我认为
^\d{1,7}\.?\d{0,2}$
应该用于检测正确的数字。
对于'空'值,您可以使用单独的测试。
答案 1 :(得分:0)
此模式不会阻止某人输入不完整的数字,例如(1,2),但会允许您请求的数字以及空格。 Null必须在传递之前被捕获。
^ # Work from the start of the line
(?!.*[\w-[\d]]) # Don't allow any Alphanumerics (A-Za-z\d) but except digits \d
(?=[\d.,]{0,12}) # Only allow for 0-12 digits or commas or periods
(?!\d{8,}) # Stop match if eight consecutive digits found
(?![\d,]{9,}) # Stop match if a combination of digits and commas exceeds 9
[\s\d.] # Allow for a space or a number period and consume it to the match.
[\d,]{0,8} # Should find numbers or a comma for up to 8 items
.? # A possible period
\d{0,2} # Two digits possible after the period
\s? # A space character (\r\n?) may be found or even an extra space (allowed per rules)
$
要使用此模式,必须使用IgnorePatternWhitespace选项,这意味着正则表达式解析器忽略模式中的空格和注释。它与加工无关。使用方法如下
Regex.IsMatch(text, pattern, RegexOptions.IgnorePatternWhitespace)
这是我的测试程序
static void Main(string[] args)
{
Console.WriteLine("Negative Tests - Only False returned in this section");
Console.WriteLine("12345678.00".IsMatch()); // False ->
Console.WriteLine("123456789.00".IsMatch());
Console.WriteLine("123a4567.00".IsMatch());
Console.WriteLine("123.4567.00".IsMatch());
Console.WriteLine ("1234567,8.00".IsMatch());
Console.WriteLine ("1,234567,8.00".IsMatch());
Console.WriteLine ("1,234567,.00".IsMatch());
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Positive Tests - Only True returned in this section");
Console.WriteLine("1234".IsMatch()); // True ->
Console.WriteLine("9999998.55".IsMatch());
Console.WriteLine("9999998.5".IsMatch());
Console.WriteLine("0.55".IsMatch());
Console.WriteLine(".55".IsMatch());
Console.WriteLine("1.5".IsMatch());
Console.WriteLine("21.22".IsMatch());
Console.WriteLine("2.".IsMatch());
Console.WriteLine("3".IsMatch());
Console.WriteLine("0.00".IsMatch());
Console.WriteLine("1,234567.10".IsMatch());
Console.WriteLine("12,34567.00".IsMatch());
Console.WriteLine(" ".IsMatch());
}
}
public static class myRegexExtensions
{
public static bool IsMatch(this string text)
{
var pattern = @"
^ # Work from the start of the line
(?!.*[\w-[\d]]) # Don't allow any Alphanumerics (A-Za-z\d) but except digits \d
(?=[\d.,]{0,12}) # Only allow for 0-12 digits or commas or periods
(?!\d{8,}) # Stop match if eight consecutive digits found
(?![\d,]{9,}) # Stop match if a combination of digits and commas exceeds 9
[\s\d.] # Allow for a space or a number period and consume it to the match.
[\d,]{0,8} # Should find numbers or a comma for up to 8 items
.? # A possible period
\d{0,2} # Two digits possible after the period
\s? # A space character (\r\n?) may be found or even an extra space (allowed per rules)
$ ";
return Regex.IsMatch(text, pattern, RegexOptions.IgnorePatternWhitespace);
}
}
答案 2 :(得分:0)
可能是,更好(更简单)的解决方案是按小数点分割字符串,然后分别测试左右部分。 让全能的正则表达本身并不是最终的结果。
答案 3 :(得分:0)
我不相信正则表达式就是这个的工具。如果规则“最多7个数字,其中散布着任意数量的逗号”,则无法用正则表达式表达它。如果您只想允许每3位数字的可选逗号的标准格式,则可能但主要涉及列出可能的组合:
(\d{0,3}|\d{1,3},?\d{0,3}|\d,?\d{1,3},?\d{0,3})
如果你不得不修改到不同的要求,这是非常难看和痛苦的。
用这个来验证格式要简单得多:
^([\d,]+)(\.\d{0,2})?$
然后通过计算Char.IsDigit为真的字符,对第一个匹配组进行额外验证。