gpt4 book ai didi

javascript - 我该如何改进这个正则表达式?

转载 作者:行者123 更新时间:2023-11-30 08:16:46 25 4
gpt4 key购买 nike

我想要一个正则表达式来匹配具有以下属性的 Tags 输入字段中的有效输入:

  • 1-5 个标签
  • 每个标签的长度为 1-30 个字符
  • 有效的标签字符是 [a-zA-Z0-9-]
  • 输入和标签可以用任意数量的空格分隔

例如:

Valid: tag1 tag2 tag3-with-dashes tag4-with-more-dashes tAaG5-with-MIXED-case

这是我目前所拥有的——它似乎有效,但我对如何简化它或者它是否存在任何重大缺陷感兴趣:

\s*[a-zA-Z0-9-]{1,30}(\s+[a-zA-Z0-9-]{1,30}){0,4}\s*

// that is:
\s* // match all beginning whitespace
[a-zA-Z0-9-]{1,30} // match the first tag
(\s+[a-zA-Z0-9-]{1,30}){0,4} // match all subsequent tags
\s* // match all ending whitespace

预处理输入以使空白问题更容易不是一种选择(例如 trim 或添加空格)。

如果重要,这将在 javascript 中使用。任何建议将不胜感激,谢谢!

最佳答案

你可以像这样简化它:

^(?:(?:^|\s+)[a-zA-Z0-9-]{1,30}){1,5}\s*$

(?: ) 语法是一个非捕获组,我相信当您本身不需要组时,它应该会提高性能。

那么诀窍就是这个语句:

(?:^|\s+)

多亏了插入符号,这将匹配行的开头,或者一个或多个空白字符。

更新:这在我的测试中非常有效,并且肯定有更少的冗余代码。但是,我只是使用了 benchmarking in Regex Hero发现你原来的正则表达式实际上更快。这可能是因为我的导致发生更多的回溯。

更新 #2:我认为我找到了另一种方法来完成同样的事情:

^(?:\s*[a-zA-Z0-9-]{1,30}){1,5}\s*$

我意识到我太努力了。 \s* 匹配 0 个或多个空格,这意味着它将适用于单个标记。但是...它也适用于 2-5 个标签,因为空格不在您的字符类 [ ] 中。事实上,它应该失败了 6 个标签。这意味着这是一个更具前瞻性的正则表达式,具有更少的回溯、更好的性能和更少的冗余。

更新#3:

我看到了我的错误。这应该会更好。

^(?:\s*[a-zA-Z0-9-]{1,30}\b){1,5}\s*$

\b 放在最后一个 ) 之前将声明一个单词边界。这允许 1-30 个字符长度的规则再次正常工作。

关于javascript - 我该如何改进这个正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com