正则表达式,匹配字符,不包含多个_后跟另一个_

时间:2016-11-04 08:26:39

标签: regex

我已经得到了匹配字符的第一部分,如下所示:^[A-Za-z0-9_]{0,}$
现在我需要检查是否有任何下划线后跟另一个下划线。我怎样才能做到这一点?

解释清单:
AAA_A - 真实 A_AA_A - 真实 A__AA - 错误

1 个答案:

答案 0 :(得分:1)

_移到字符类之外并使用*量化组:

^[A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$

请参阅regex demo。由于组之后的*,表达式仍将匹配空字符串,但+不会让整个字符串等于1个下划线。这也意味着_可以出现在字符串的开头(如果您需要禁止此操作,请在(?!^)之前添加_)。

如果字符串可以为空,或者可以等于_,则您还可以使用^[A-Za-z0-9]*(?:_(?!_)[A-Za-z0-9]*)*$demo)正则表达式变体。

模式详情

  • ^ - 字符串开头
  • [A-Za-z0-9]* - 零个或多个字母数字
  • (?: - 开始匹配以下序列的组:
    • _ - 下划线
    • [A-Za-z0-9]+ - 一个或多个字母数字
  • )* - 群组结束,可以发生0次或更多次
  • $ - 字符串结束。

另一种方法 - 使用否定前瞻:

^(?!.*__)[A-Za-z0-9_]*$

this regex demo。一旦在字符串开始后的某处找到(?!.*__)__将失败。要分析多线字符串,请使用DOTALL修饰符(在Ruby / Oniguruma中,/m修饰符),如果它不可用(如在JS中),请使用[\s\S]*而不是.*