正则表达式查找带空格的整数中的无效字符

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 是的,前面有多个空格 - 符号有效。我将其添加到示例中。 为什么-100100无效? 好的,使用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 空白字符或 - 字符 | - 或 (?&lt;!^\s*)- - 一个 - 字符,前面没有任何任何 0+ 空格字符的字符串开头。

【讨论】:

以上是关于正则表达式查找带空格的整数中的无效字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

PCI 合规性正则表达式检测带空格的模式

正则表达式中的 perl 正则表达式

C# MVC - 具有单个空格或多个空格的整数的正则表达式

正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格

正则表达式查找 4 个条件中的 3 个