【问题标题】: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给我看代码。

标签: c# regex numbers match


【解决方案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+ 空格字符的字符串开头。

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多