[英]Regular Expression to allow only 0-9 digits only (Not even '.' [Dot]) in JSP using 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.