Javascript 如何编写只允许某些字符重复一次的正则表达式?
我正在尝试创建一个符合以下特征的正则表达式: n最大总字符数; 允许[a-z]和[a-z]在字符串中重复任意次数; 允许[_.]但不能在字符串中相邻; 不能以u或开头。 比如说 福-好 富吧-很好 foo____bar-重复错误_ 富巴兹-很好 福乌酒吧-很好 foo_uuu.bar-相邻不良uuuu和。 _福坏领导_ .foo-糟糕的领导。Javascript 如何编写只允许某些字符重复一次的正则表达式?,javascript,regex,Javascript,Regex,我正在尝试创建一个符合以下特征的正则表达式: n最大总字符数; 允许[a-z]和[a-z]在字符串中重复任意次数; 允许[_.]但不能在字符串中相邻; 不能以u或开头。 比如说 福-好 富吧-很好 foo____bar-重复错误_ 富巴兹-很好 福乌酒吧-很好 foo_uuu.bar-相邻不良uuuu和。 _福坏领导_ .foo-糟糕的领导。 我正在使用JS。我一直想弄明白,但运气不好。希望有人能帮我节省一些时间!谢谢。至少从一个字母开始。然后是可选的特殊/标点字符。根据需要重复多次,直到字符串
我正在使用JS。我一直想弄明白,但运气不好。希望有人能帮我节省一些时间!谢谢。至少从一个字母开始。然后是可选的特殊/标点字符。根据需要重复多次,直到字符串结束
^([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
至少从一个字母开始。然后是可选的特殊/标点字符。根据需要重复多次,直到字符串结束
^([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
下面是一个简单的基于非前瞻性的正则表达式:
/^[a-z](?:[_.]?[a-z])*$/gmi
这将只允许在开始和结束处使用字母,不允许使用相邻的点或下划线字符。这里是一个简单的基于非前瞻性的正则表达式:
/^[a-z](?:[_.]?[a-z])*$/gmi
这将只允许在开始和结束处使用字母,不允许使用相邻的点或下划线字符。提供的其他正则表达式虽然可以工作,但过于复杂且效率低下。下面的正则表达式将匹配除了长度检查之外所需的内容,因为这是使用字符串本身的.length最有效的方法 /^?:[a-zA-Z]+[_.]+$/
它只是说,找到至少一个或多个字母,然后找到一个可选的“或”,然后找到至少一个或多个字母,再找到一个可选的“或”,等等。提供的其他正则表达式虽然可以工作,但过于复杂且效率低下。下面的正则表达式将匹配除了长度检查之外所需的内容,因为这是使用字符串本身的.length最有效的方法 /^?:[a-zA-Z]+[_.]+$/
它只是说,在一个正则表达式中找到至少一个或多个字母,然后找到一个可选的“或”,然后找到至少一个或多个字母,以及一个可选的“或”,等等 /^[a-z]?:[a-z]|[|]?![[uu.]{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
全部在一个正则表达式中 /^[a-z]?:[a-z]|[|]?![[uu.]{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
@anubhava我在regex101.com上花了大约一个小时玩regexes。太多,无法显示:D@anubhava还有javascript。@anubhava我没有,但我忘了把它添加到我的标准中。我将自己在代码中添加它。没有这个测试,已经有很多答案了。非常感谢:D:D@anubhava我在regex101.com上花了大约一个小时玩regex。太多,无法显示:D@anubhava还有javascript。@anubhava我没有,但我忘了把它添加到我的标准中。我将自己在代码中添加它。没有这个测试,已经有很多答案了。非常感谢:D:在我的情况下,没有理由将总长度包含在正则表达式中。那个么,我将使用这个,若一个长度更大的正则表达式,我将使用一个单独的长度测试complicated@dimadima我重新阅读了你的规则,我不清楚反斜杠是否是你想要允许的字符。我可能犯了一个错误——我在字符类中漏掉了点。DOT不需要在字符类中转义吗?@dimadima不,这是我想的,我已经编辑了答案。为了捕捉foo或foo\u bar,不应该是可选的吗?我相信^[a-zA-Z]+[.]?+$就是你的意思。在我的情况下,没有理由将总长度包含在正则表达式中。那个么,我将使用这个,若一个长度更大的正则表达式,我将使用一个单独的长度测试complicated@dimadima我重新阅读了你的规则,我不清楚反斜杠是否是你想要允许的字符。我可能犯了一个错误——我在字符类中漏掉了点。DOT不需要在字符类中转义吗?@dimadima不,这是我想的,我已经编辑了答案。为了捕捉foo或foo\u bar,不应该是可选的吗?我相信你的意思是“^[a-zA-Z]+[.]?+$”。你能解释一下这个前瞻性吗?谢谢!我认为这是考虑到第一个角色要求的唯一答案。这是非常低效的。lookahead并不便宜,在这种情况下,它完全没有必要。@dimadima其他正则表达式也一样。通过指定^(字符串元字符的开头)并在其后加上[A-Za-z],可以告诉正则表达式字符串必须以字母开头。@michael我认为该注释是指dimadim
a的评论就在它之前。你能解释一下这个展望吗?谢谢!我认为这是考虑到第一个角色要求的唯一答案。这是非常低效的。lookahead并不便宜,在这种情况下,它完全没有必要。@dimadima其他正则表达式也一样。通过指定^(字符串元字符的开头)并在其后加上[A-Za-z],您告诉正则表达式字符串必须以字母开头。@michael,我认为该评论是在引用dimadima之前的评论。与其他答案相比,捕获组是否真的能提高性能,称其为低效?编辑后,你的正则表达式与@shawnt00的正则表达式是一字不差的,所以我不确定它是否能证明过于复杂和低效的批评是正确的。捕获组确实起到了作用。然而,在这一点上,我们谈论的是微优化,这取决于OP是要运行一次还是一百万次,等等。公平地说,当我发表声明时,他的回答根本不正确,与效率低下的部分没有直接关系。是的,我在编辑后做了免责声明,以便在到期时给你评分;你的答案是正确的。我只是觉得批评把它弄得乱七八糟。说句公道话,我明白你的意思。为了记录在案,我对你的答案投了更高的票。与其他答案相比,捕获群体是否真的能给表现带来那么大的提升,称之为低效?编辑后,你的正则表达式与@shawnt00的正则表达式是一字不差的,所以我不确定它是否能证明过于复杂和低效的批评是正确的。捕获组确实起到了作用。然而,在这一点上,我们谈论的是微优化,这取决于OP是要运行一次还是一百万次,等等。公平地说,当我发表声明时,他的回答根本不正确,与效率低下的部分没有直接关系。是的,我在编辑后做了免责声明,以便在到期时给你评分;你的答案是正确的。我只是觉得批评把它弄得乱七八糟。说句公道话,我明白你的意思。为了记录在案,我对你的答案投了赞成票。谢谢,这很好。我也喜欢格式。谢谢,这很好。我也喜欢格式。