【问题标题】:Regex to match two or more consecutive characters正则表达式匹配两个或多个连续字符
【发布时间】:2013-01-04 23:36:25
【问题描述】:

使用正则表达式我想匹配一个单词

  • 以字母开头
  • 有英文字母
  • 数字、句点(.)、连字符(-)、下划线(_)
  • 不应有两个或多个连续句点或连字符或下划线
  • 可以有多个句点、连字符或下划线

例如,

flin..stones 或 flin__stones 或 flin--stones

不允许。

fl_i_stones 或 fli_st.ones 或 flin.stones 或 flinstones

是允许的。

到目前为止,我的正则表达式是 ^[a-zA-Z][a-zA-Z\d._-]+$

所以我的问题是如何使用正则表达式来做到这一点

【问题讨论】:

  • 您使用的是哪种语言或工具?另外,你的问题是什么?
  • 你解决了这个问题吗?
  • @xzegga 是的,下面回答有帮助

标签: c# .net regex


【解决方案1】:

您可以使用lookaheadbackreference 来解决此问题。但请注意,现在您至少需要 2 个字符。起始字母和另一个(由于+)。您可能想要制作 +* 以便第二个字符类可以重复 0 次或更多次:

^(?!.*(.)\1)[a-zA-Z][a-zA-Z\d._-]*$

前瞻是如何工作的?首先,这是一个消极的前瞻性。如果内部的模式找到匹配项,则前瞻会导致整个模式失败,反之亦然。因此,如果我们 确实 有两个连续的字符,我们可以在里面有一个匹配的模式。首先,我们在字符串 (.*) 中查找任意位置,然后匹配单个(任意)字符 (.) 并用括号捕获它。因此,该角色进入捕获组1。然后我们要求这个捕获组跟在它后面(用\1 引用它)。因此,内部模式将尝试在字符串中的每个位置(由于backtracking)是否有一个字符紧随其后。如果找到这两个连续字符,则该模式将失败。如果找不到,引擎会跳回到前瞻开始的地方(字符串的开头)并继续匹配实际的模式。

或者,您可以将其拆分为两个单独的检查。一个用于有效字符和起始字母:

^[a-zA-Z][a-zA-Z\d._-]*$

还有一个用于连续字符(您可以在其中反转匹配结果):

(.)\1

这将大大提高您的代码的可读性(因为它不像前瞻那样晦涩难懂),还可以让您以模式检测实际问题并返回适当且有用的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2013-09-24
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多