.NET多行正则表达式限制为整数

4

我遇到了一个非常简单的正则表达式问题。

我想限制多行文本框中的输入只能是整数。我已经使用了一个正则表达式,在单行模式下运行良好(对于单行文本框,不使用多行选项),但是在多行模式下允许字母字符进入,但只有在输入新行后才会发生。

我的代码(C#)大致如下:

Regex regExpr = new Regex("^(\d*)$", RegexOptions.Multiline)
return regExpr.IsMatch(testString);

我希望以下示例是有效的:
1

1\\n

1\\n2\\n3

我希望以下内容无效。
A

A1\\n2

1\\n2\\nA3

提前感谢您。

3个回答

1

您可以使用以下方式匹配数字和换行符:

Regex regExpr = new Regex("[\d\n]*", RegexOptions.Multiline)

这将匹配任意数量的数字和换行符。如果您只想确保输入的文本没有非数字字符,则使用

Regex regExpr = new Regex("[\D\S]", RegexOptions.Multiline)

如果匹配成功,那么你就有一个非法条目。


嗨,安德鲁,恐怕这两个都没有达到我想要的效果。第一个允许“A1\n2\n3”通过,第二个不允许有效的“1\n2\n3”通过。我更喜欢它是一个正匹配而不是一个“非匹配”,因为我的问题详细说明了我需要的部分,在某些情况下,正则表达式是不同的(例如,验证十进制输入或IP地址输入)。 - Darren
第一个正则表达式试图捕获文本框中的数字和换行符。如果您想确保只接受有效输入,则执行以下操作:将RegexOptions更改为RegexOptions.Singleline 并将正则表达式更改为“^ [\ d \ n] * $”,就像您在示例中显示的那样。这将一次解析整个字符串,并且^和$将匹配字符串的开头和结尾。 - Andrew
感谢Andrew和Nicolas的建议,我通过放弃RegexOptions.Multiline并将我的单行表达式用“(”...“\n?)”进行“包装”而解决了问题。所以整数表达式变成了“^((\d)\n?)*$”,看起来完美运行。 - Darren
Singleline修饰符改变了.(点)元字符的行为,使其可以匹配换行符以及所有其他字符。Multiline影响锚点^$,使它们可以在行边界处匹配,而不仅仅是在文本开头和结尾进行匹配。Singleline对锚点没有影响,而Multiline不影响点;它们是完全独立的。 - Alan Moore

0
你想要破坏性地删除字母还是将其发送回用户以重新输入信息?
如果要删除,只需使用空结果进行搜索替换即可。
[^\d\n]
要检查是否有除数字和 \n 之外的任何内容,请在第一次出现错误时执行相同的操作,提交页面并将其发送回用户。
由于我不知道您正在使用哪种 .Net 语言,因此我只能提供一般原则。

我正在一个WPF应用程序中使用C#。我只想返回IsMatch调用的结果。我已经相应地编辑了我的问题。 - Darren

0

关于什么?

(\d?\\n*)?

这似乎并没有限制我的输入。它是否缺少起始和结束标记? - Darren
你是对的,抱歉我的错误。尝试这个:^(\d+\n*)+$ - Nicolas
很遗憾,那并没有解决问题。它匹配的是"A1\n2\n3",这与我的原始表达式相同。我认为问题非常明显是多行问题。我对正则表达式并不是很有经验,但我的理论是因为上面的一行是有效的,所以会有匹配。 - Darren
我刚刚尝试了一下,没有使用RegexOptions.Multiline选项,我认为它可以工作。我会再做一些检查,看看能否实现完整的解决方案。 - Darren
感谢Andrew和Nicolas的建议,我通过放弃RegexOptions.Multiline并将我的单行表达式用"(" ... ""\n?)"包装来解决了问题。因此,整数表达式变为"^((\d)\n?)*$",看起来完美地解决了问题。 - Darren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接