我正在尝试制作符合以下特征的正则表达式:
[a-z]
和[A-Z]
在字符串中重复多次; [_.]
但不能在字符串中相邻; _
或.
所以,例如
foo
- 好foo_bar
- 好foo__bar
- 糟糕(重复_
)foo_bar_baz
- 好foo_bar.baz
- 好foo_.bar
- 错误(相邻_
和.
)_foo
- 糟糕(领先_
.foo
- 糟糕(领先.
)我正在使用JS。我一直试图解决这个问题,但没有运气。希望有人可以帮我节省一些时间!谢谢。
答案 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)
答案 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