我知道有很多关于制作正则表达式的问题,但它们似乎都只是一个问题,而不是一般用法。我也有一个问题要解决。我试着通过阅读正则表达式来学习,但它很快就变得棘手。这是我的问题:
C#
我需要验证同一表单上存在的两个文本框。我编码的数学运算可以处理任何浮点数。对于这个特定的应用程序,我知道数字将处于三种格式或代表用户有错误。如果一个额外的号码被意外输入或者输入过早等等,我想在例子中防止这些错误。
以下是格式:"#。####" " ## ####&#34。 " ### ##&#34。 "#"代表强制数字。以一位或两位数整数开头的格式必须有4个或更多的尾随数字。我把它限制在8,或者我试图大声笑。从三位数的整数开始的格式永远不允许有超过两位数的小数。
这是我迄今为止所尝试的内容。
Regex acceptedInputRegex = new Regex(@"^\b[0-9]{3}.[0-9]{2}|[0-9]{1,2}.[0-9]{4,8}$");
Regex acceptedInputRegex = new Regex(@"^\b\d{3}.\d{2} | \d{1,2}.\d{4,8}$");
我已经尝试过,我认为匹配是我想要实现的,就好像与我的否定表达的匹配意味着存在问题。我在两次尝试都没有成功。这是代码:
if (acceptedInputRegex.IsMatch(txtMyTextBox1.Text) || acceptedInputRegex.IsMatch(txtMyTextBox2.Text))
{
} else
{
MessageBox.Show("Numbers are not in the right format", "Invalid Input!");
return;
}
感谢。
答案 0 :(得分:4)
你很接近,你需要逃避点并对备选方案进行分组,以便^
和$
锚点可以应用于它们:
@"^(?:\d{3}\.\d{2}|\d{1,2}\.\d{4,8})$"
请参阅regex demo。
<强>详情:
^
- 字符串开头(?:
- 开始non-capturing group匹配以下两种选择中的任何一种:
\d{3}\.\d{2}
- 3位数,.
和2位数|
- 或\d{1,2}\.\d{4,8}
- 1位或2位数,.
,4到8位)
- 非捕获组的结束$
- 字符串结束。要使\d
仅匹配ASCII数字,请使用RegexOptions.ECMAScript
选项:
var isValid = Regex.IsMatch(s, @"^(?:\d{3}\.\d{2}|\d{1,2}\.\d{4,8})$", RegexOptions.ECMAScript);