如何编写一个允许某些字符只重复一次的正则表达式?

时间:2016-02-01 20:03:56

标签: javascript regex

我正在尝试制作符合以下特征的正则表达式:

  • n最大总字符数;
  • 允许[a-z][A-Z]在字符串中重复多次;
  • 允许[_.]但不能在字符串中相邻;
  • 无法以_.
  • 开头

所以,例如

  • foo - 好
  • foo_bar - 好
  • foo__bar - 糟糕(重复_
  • foo_bar_baz - 好
  • foo_bar.baz - 好
  • foo_.bar - 错误(相邻_.
  • _foo - 糟糕(领先_
  • .foo - 糟糕(领先.

我正在使用JS。我一直试图解决这个问题,但没有运气。希望有人可以帮我节省一些时间!谢谢。

4 个答案:

答案 0 :(得分:5)

从至少一个字母开头。通过可选的特殊/标点符号来跟随它。根据需要重复多次,直到字符串结束。

^([a-zA-Z]+[_.]?)+$
^([a-zA-Z]+[_.]?)[a-zA-Z]+$ // disallow special character at end

单独处理长度测试。是否需要将其包含在正则表达式中?如果您严格要求,可以通过前瞻处理它。

^(?=.{6,10}$)([a-zA-Z]+[_.]?)+$ // for example, length between 6 and 10

答案 1 :(得分:3)

提供的其他正则表达虽然可能有效但却过于复杂且效率低下。以下正则表达式将匹配您想要的内容(不包括长度检查,因为字符串本身对.length的效率最高。

/^(?:[a-zA-Z]+[_.]?)+$/

它只是说,找到至少一个字母(或更多),然后是可选的_.,然后找到至少一个字母(或更多),以及一个可选的{{1 }或_等等。

答案 2 :(得分:2)

这是一个简单的非前瞻性正则表达式:

/^[a-z](?:[_.]?[a-z])*$/gmi

RegEx Demo

这只会允许开头和结尾的字母,并且不会允许相邻的DOTunderscore字符。

答案 3 :(得分:1)

所有在一个正则表达式

/^[a-z](?:[a-z]|[_.](?![_.])){0,19}$/i

评论

 # N = 20, range: 1 - 20
 # ------------------------
 ^                 # BOS
 [a-z]             # Start with letter
 (?:               # Count group
      [a-z]             # a - z
   |                  # or
      [_.]              # underscore or dot
      (?! [_.] )        # if not followed by same
 ){0,19}           # End count, 0 to N-1
 $                 # EOS 

测试样本:

foo
foo_bar
foo__bar
foo_bar_baz
foo_bar.baz
foo_.bar
_foo
.foo

基准:

Regex1:   ^[a-z](?:[a-z]|[_.](?![_.])){0,19}$
Options:  < m - i >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   4
Elapsed Time:    0.67 s,   673.02 ms,   673023 µs