Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何编写只允许某些字符重复一次的正则表达式?_Javascript_Regex - Fatal编程技术网

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

Javascript 如何编写只允许某些字符重复一次的正则表达式?,javascript,regex,Javascript,Regex,我正在尝试创建一个符合以下特征的正则表达式: n最大总字符数; 允许[a-z]和[a-z]在字符串中重复任意次数; 允许[_.]但不能在字符串中相邻; 不能以u或开头。 比如说 福-好 富吧-很好 foo____bar-重复错误_ 富巴兹-很好 福乌酒吧-很好 foo_uuu.bar-相邻不良uuuu和。 _福坏领导_ .foo-糟糕的领导。 我正在使用JS。我一直想弄明白,但运气不好。希望有人能帮我节省一些时间!谢谢。至少从一个字母开始。然后是可选的特殊/标点字符。根据需要重复多次,直到字符串

我正在尝试创建一个符合以下特征的正则表达式:

n最大总字符数; 允许[a-z]和[a-z]在字符串中重复任意次数; 允许[_.]但不能在字符串中相邻; 不能以u或开头。 比如说

福-好 富吧-很好 foo____bar-重复错误_ 富巴兹-很好 福乌酒吧-很好 foo_uuu.bar-相邻不良uuuu和。 _福坏领导_ .foo-糟糕的领导。
我正在使用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是要运行一次还是一百万次,等等。公平地说,当我发表声明时,他的回答根本不正确,与效率低下的部分没有直接关系。是的,我在编辑后做了免责声明,以便在到期时给你评分;你的答案是正确的。我只是觉得批评把它弄得乱七八糟。说句公道话,我明白你的意思。为了记录在案,我对你的答案投了赞成票。谢谢,这很好。我也喜欢格式。谢谢,这很好。我也喜欢格式。