【问题标题】:Alpha numeric lower case case and "-" ,字母数字小写和“-”,
【发布时间】:2014-05-01 09:35:44
【问题描述】:

我想验证用户只输入以下内容:

  1. 字母数字 a to z 仅小写。
  2. 可以包含连字符‘-’,但不能以它开头或结尾。
  3. 可以包含'.',但不能以它开头或结尾。
  4. 末尾可以有空格。

我尝试了以下但它不起作用,有什么想法如何改变它?

"^[a-z0-9]+(\.-[a-z0-9]+)*$"

【问题讨论】:

  • 请确保您的语法一致。如果那是 C# 字符串(如引号所暗示的那样),则可能需要复制反斜杠。如果是正则表达式本身,请去掉引号。

标签: c# regex


【解决方案1】:

你可以使用这个正则表达式:

^[a-z\d][\da-z-.]*[a-z\s\d]$

^[a-z\d] 表示以 a-z 或数字开头。

然后

[\da-z-.]* 表示匹配 0 个或多个数字、a-z、连字符和点

[a-z\s\d]$ 表示它只允许 a-z 或数字或空格。

【讨论】:

  • 在没有任何解释的情况下盲目复制和粘贴的答案可能会在这种特殊情况下帮助 OP,但它可能无法帮助他们理解如何普遍解决此类问题,而且帮助不大任何有类似但不完全相同问题的未来访问者。
  • @O.R.Mapper,如果您引用了复制粘贴,请对此发表评论。否则,不要。另外,我将包括解释
  • 我不明白你的评论,你能改一下吗? “引用复制粘贴”是什么意思?
  • 顺便说一句,虽然我同意这个问题含糊不清,但您建议的正则表达式要求匹配字符串的最小长度为三个字符,这不是问题中包含的限制。跨度>
  • @AmitJoki:我认为这意味着 OP 会在不学习任何内容的情况下复制并粘贴您的答案,而不是您从某个地方复制它。
【解决方案2】:

shopia,你可以这样做:

bool isValid = false;
try {
    isValid = Regex.IsMatch(s1, @"^[a-z\d][-.a-z\d]* ?(?<![-.])$");
} catch (ArgumentException ex) {
    // some syntax error
}

这是引擎在从左到右读取字符串时尝试从左到右匹配的标记。

  1. ^ 断言我们位于字符串的开头。
  2. [a-z\d] 字符类匹配一个字母或数字。
  3. [-.a-z\d] 匹配一个破折号、点、字母或数字,* 使这种情况发生零次或多次。
  4. ?(注意问号前的空格)允许末尾有空格
  5. (?&lt;![-.]) 是一个否定的后视,断言在字符串中的这个位置,我们前面没有紧跟破折号或点
  6. $ 断言我们在字符串的末尾。

请注意,在可选空格字符之前是否允许使用点或破折号并不完全清楚。我假设答案是肯定的,因为在abcd- 中,破折号不在字符串的末尾。但是,如果您不想在破折号之前允许该字符,只需将否定的lookbehind移到后面,以便您的正则表达式变为:

^[a-z\d][-.a-z\d]*(?<![-.]) ?$

【讨论】:

  • 缺少数字 - 已添加
  • Tomas,想告诉我你为什么回滚我的编辑?至少让我知道我是否做错了什么。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2019-08-08
相关资源
最近更新 更多