繁体   English   中英

如何在 javascript 中使用正则表达式在用户表单输入中只允许一个(破折号或点或下划线)?

[英]How do i allow only one (dash or dot or underscore) in a user form input using regular expression in javascript?

我正在尝试在 javascript 中实现用户名表单验证,其中用户名

  • 不能以数字开头
  • 不能有空格
  • 不能有任何符号,只能有一个点或一个下划线或一个破折号

有效用户名示例:the_user-one.123
无效用户名示例:1----- 用户

我一直在尝试实现这一点,但我不知道如何只拥有每个允许的符号之一:-

 const usernameValidation = /(?=^[\w.-]+$)^\D/g console.log(usernameValidation.test('1username')) //false console.log(usernameValidation.test('username-One')) //true

前言:由于我的严重粗心,我假设上下文是使用 HTML pattern属性而不是 JavaScript 输入验证。 我把这个答案留给后代,以防有人真的想用正则表达式来做这件事。


尽管正则表达式确实具有表示在一定次数内连续发生的模式的功能(通过{<lower-bound>,<upper-bound>} ),但我不知道正则表达式具有“优雅”功能来强制执行集合每个模式都在一定次数范围内出现,但以任何顺序出现,并且可能在其间出现其他模式。

我能想到的一些解决方法:

制作一个允许特殊字符排序的每个排列之一的正则表达式(注意:为可读性添加了换行符):

^(?:
(?:(?:(?:[A-Za-z][A-Za-z0-9]*\.?)|\.)[A-Za-z0-9]*-?[A-Za-z0-9]*_?)|
(?:(?:(?:[A-Za-z][A-Za-z0-9]*\.?)|\.)[A-Za-z0-9]*_?[A-Za-z0-9]*-?)|
(?:(?:(?:[A-Za-z][A-Za-z0-9]*-?)|-)[A-Za-z0-9]*\.?[A-Za-z0-9]*_?)|
(?:(?:(?:[A-Za-z][A-Za-z0-9]*-?)|-)[A-Za-z0-9]*_?[A-Za-z0-9]*\.?)|
(?:(?:(?:[A-Za-z][A-Za-z0-9]*_?)|_)[A-Za-z0-9]*\.?[A-Za-z0-9]*-?)|
(?:(?:(?:[A-Za-z][A-Za-z0-9]*_?)|_)[A-Za-z0-9]*-?[A-Za-z0-9]*\.?)
)[A-Za-z0-9]*$

请注意,如果您也不希望用户名以特殊字符开头,则可以简化上述正则表达式。

友情提醒,还要确保您使用 HTML 属性在适当的情况下强制执行最小和最大输入字符长度。

如果您觉得正则表达式不太适合您的用例,请知道您可以使用 javascript 进行自定义验证逻辑,与正则表达式相比,它可以为您提供更多的控制权并且更具可读性,但可能需要更多的代码行来实施。 看到上面的正则表达式,我个人会认真考虑自定义 javascript 路由。

注意:我发现https://regex101.com/对学习、编写和测试正则表达式很有帮助。 确保在您的情况下将“风味”设置为“JavaScript”。

我不得不承认,泡泡泡泡的解决方案更合适。 以下是不同情况的比较:

 console.log("Comparison between mine and Bobble Bubble's solution:\n\nusername mine,BobbleBubble"); ["valid-usrId1","1nvalidUsrId","An0therVal1d-One","inva-lid.userId","anot-her.one","test.-case"].forEach(u=>console.log(u.padEnd(20," "),chck(u))); function chck(s){ return [..s.match(/^[a-zA-Z][a-zA-Z0-9._-]*$/) && ( s.match(/[,_-]/g) || []).length<2? // mine.?s.match(/^(..\d|.*,([_;-]).*\1)[\w.-]+$/)].join(","); // Bobble bulle }

在最后三个测试用例中可以看到差异。

如何在开始时使用负前瞻

^(?!\d|.*?([_.-]).*\1)[\w.-]+$

这将检查字符串是否

在 regex101 上查看这个演示(右侧有更多解释)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM