正则表达式查找带空格的整数中的无效字符
Posted
技术标签:
【中文标题】正则表达式查找带空格的整数中的无效字符【英文标题】:Regex to find invalid characters in integer with whitespaces 【发布时间】:2020-05-31 19:57:50 【问题描述】:我想使用正则表达式 (regex) 来查找字符串中的无效字符。该字符串是用户输入,当正则表达式发现无效字符时,我想向用户反馈哪些字符无效。警告消息示例:“仅允许 0-9 和空格。发现无效字符:ab”当输入为 "- 10 a 0 b"
时。
一个有效的字符串是:
整数 消极或积极 允许在任何位置有任意数量的空格。例如,那些 VALID 字符串不应该与正则表达式匹配:
"-100"
"- 1 00"
" - 1 00"
"100"
" 1 0 0 "
"1 00"
虽然正则表达式应该在这些 INVALID 字符串中找到匹配项:
"- 1 a 0 0 b" should match "a" and "b"
"- 1 a 0 0 -" should match "a" and "-"
我有一个用于正整数的正则表达式,直到我发现我忘记包含负整数:
var regex = new Regex(@"[^0-9\s]")
var invalidCharacters = regex.Matches(text)
我只有非常基本的正则表达式知识。我尝试否定正则表达式以包含负整数,但它不起作用:
new Regex(@"(?!-?[0-9\s])")
我希望有人可以帮助我解决这个问题。如果通过删除空格要求可以更容易地解决这个问题。那么请随意忽略空白部分。
【问题讨论】:
" - 1"
是否有效(即-
符号前的开头有多个空格?
@Nick 是的,前面有多个空格 - 符号有效。我将其添加到示例中。
为什么-100
和100
无效?
好的,使用var invalidCharacters = Regex.Matches(text, @"[^0-9\s-]|(?<!^\s*)-")
不,it does not。 给我看代码。
【参考方案1】:
我会首先考虑肯定的情况来解决这个问题 - 哪些字符串是有效的?然后用否定的环视来否定它。
我认为这符合您的要求:
(?!\s*-?[\d\s]).
\s*
将匹配开头的任何空格
-?
可以选择匹配连字符
[\d\s]
将匹配数字和空格
(?!expression)
是否定整个表达式的否定环视
末尾的.
是一种生成匹配的方法。否定的环视只是一个断言——它不会返回任何结果。
它会为您问题中的测试用例生成所需的结果。
【讨论】:
最后的.
是干什么用的?
否定的环视只是一个断言。 .
允许正则表达式具体化结果。
好的,谢谢。两个答案都运行良好。我会接受这个,因为我发现正则表达式更容易理解。【参考方案2】:
你可以使用
var invalidCharacters = Regex.Matches(text, @"[^0-9\s-]|(?<!^\s*)-");
参见regex demo(稍作修改,因为演示是针对单个多行字符串的测试。)
正则表达式匹配:
[^0-9\s-]
- 非 ASCII 数字的字符、任何 Unicode 空白字符或 -
字符
|
- 或
(?<!^\s*)-
- 一个 -
字符,前面没有任何任何 0+ 空格字符的字符串开头。
【讨论】:
以上是关于正则表达式查找带空格的整数中的无效字符的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词