【问题标题】:How to check a string contains only en-us keyboard characters?如何检查字符串仅包含 en-us 键盘字符?
【发布时间】:2020-10-02 09:25:33
【问题描述】:

如何检查一个字符串,它是否只包含键盘字符,即 a-z、A-Z、0-9,以及所有特殊字符(如 ~!@#$%^&*()_+|}{": ?>

【问题讨论】:

  • 也许 OP 不适合 RegEx(即使是简单的)并且不喜欢使用它们,这完全有道理
  • @Cid: 可能是这样,但这样说——包含更多细节——比“这个或其他人对我没有帮助”有用得多。如果我们不知道现有答案在哪些方面没有帮助,那么我们提供的任何其他答案也可能会被拒绝。
  • @MgBhadurudeen 只需将您想要支持的所有字符添加到正则表达式集合中。例如^[a-zA-Z0-9!@#$%^&*().,\-+]*$ 只需注意某些字符(如-)需要用`\`转义
  • @MgBhadurudeen 你想做什么?这听起来像是一个 XY 问题。您要解决的实际问题是什么?您是否尝试强制执行某种密码字符限制?任何人都可以随时将任何键盘布局添加到任何机器(PC、手机)并在它们之间切换。即使在一个国家也有多种布局,尤其是美国。
  • 你错了,我已经发布了布局之间差异的链接。同样,真正的问题是什么?您描述的是尝试的解决方案。你想清理输入吗?如果您想限制密码字符,您将引入一个漏洞。美国 (NIST) 和英国 (NSCS) 当局warn against restricting password input.

标签: c#


【解决方案1】:

英美键盘布局中立即(不带 Alt)可用字符的代码点介于 32 到 126 之间。

在 C# 上,您可以完全跳过正则表达式

input.All(c=> c >= 32 && c <= 126);

它只是验证input 内的所有char 与范围匹配。从技术上讲,由于 character encoding,单个 Unicode 字符可能涉及多个 char,但只要您检查 所有 它们都在范围内,就可以了。

或者如果你想要正则表达式:

Regex.IsMatch(input, @"^[\u0020-\u007E]*$"); //true on empty string

Regex.IsMatch(input, @"^[\u0020-\u007E]+$"); //must be at least one character

也是一样,^指定匹配必须从字符串的开头开始,括号内的所有内容指定范围,在32到126之间,除了它们是用十六进制写的,*允许任何长度, + 允许 1 到更多,$ 指定匹配必须覆盖到字符串的结尾。

请注意,任何其他布局(英语-英国、国际英语等)的用户都会对您的限制感到非常恼火。

【讨论】:

  • 谢谢。我理解你回答的最后一行。上面的代码拒绝来自其他布局的用户的输入。如果此代码允许的输入字符串可以通过任何其他布局(英语-英国、国际英语等)键入,我将是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
相关资源
最近更新 更多