常见的表单验证正则表达式

发布于 2022-11-12 20:25:06 字数 4583 浏览 27 评论 0

常用的正則方法示例

replace

// 使用正则匹配中文字节, 将其替换为xx, 再获取字符串的长度就是完整的长度了.
function getLen(str) { return str.replace(/[^\x00-\xff]/g, 'xx').length; }

test

// 匹配是否符合邮件规则var reg =/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
// test 返回一个布尔值, 表示是否匹配到制定字符串var mail =reg.test('anran758@gmail.com')
if (mail) {
  // 如果邮件格式正确的话, 就可以做点啥了(雾
}

常见的表单验证

// 用户名正则,4到16位(字母,数字,下划线,减号)var userNameReg =/^[a-zA-Z0-9_-]{4,16}$/;

// 密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符var passwordReg =/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;

// 匹配邮箱地址var mailReg =/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;

// 中国六位数的邮政编码var postalCode =/^\d{6}$/;

// 匹配15~18位身份证var IDCard =/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/;

// 匹配18位的新版身份证var IDCard_18 =/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

网络相关

//ipv4地址正则var IPReg =/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;

// Reg Hex颜色正则var pattern =/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;

// URL正则var urlReg=/^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*\/?$/;

// 匹配JSON格式var reg =/^\w+\(({[^()]+})\)$/

匹配 json 字符串

var ret =response.data;
if (typeof ret ==='string') {
  var reg =/^\w+\(({[^()]+})\)$/var matches =ret.match(reg);

  if (matches) ret =JSON.parse(matches[1]);
}
res.json(ret);

联系方式

// 5-11位的腾讯qq号var qqReg =/^[1-9][0-9]{4,11}$/;

// 微信号正则,6至20位,以字母开头,字母,数字,减号,下划线var qqReg =/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;

// 国内常见var phone =/^1[3|5|8|9]\d{9}$/;

// 固定电话var telephone =/^(0[0-9]{2})\d{8}$|^(0[0-9]{3}(\d{7,8}))$/;

匹配特定数字

// 匹配正整数var reg =/^[1-9]\d*$/;

// 匹配负整数var reg =/^-[1-9]\d*$/;

// 匹配整数var reg =/^-?[1-9]\d*$/;

// 匹配非负整数(正整数 + 0)var reg =/^[1-9]\d*|0$/;

// 匹配非正整数(负整数 + 0)var reg =/^-[1-9]\d*|0$/;

// 匹配正浮点数var reg =/^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$/;

// 匹配负浮点数var reg =/^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$/;

// 匹配浮点数var reg =/^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$/;

// 匹配非负浮点数(正浮点数 + 0)var reg =/^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$/;

// 匹配非正浮点数(负浮点数 + 0)var reg =/^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$/;

字符串相关

// 匹配由26个英文字母组成的字符串var reg =/^[A-Za-z]+$/;

// 匹配由26个英文字母的大写组成的字符串var reg =/^[A-Z]+$/;

// 匹配由26个英文字母的小写组成的字符串var reg =/^[a-z]+$/;

// 匹配由数字和26个英文字母组成的字符串var reg =/^[A-Za-z0-9]+$/;

// 匹配由数字、26个英文字母或者下;划线组成的字符串var reg =/^\w+$/;

// 匹配空白行的正则表达式var reg =/\n\s*\r/;

// 匹配首尾空白字符的正则表达式var reg =/^\s*|\s*$/;
var rtrim =/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

// 匹配双字节字符(包括汉字在内, 一个双字节字符长度计2,ASCII字符计1)var reg =/[^\x00-\xff]/g;

正则表达式中的 .

我们知道,正则表达式中,可以用 . 表示任意单个字符,但在 underscore 和 jquery 的源代码中,我们可以看到,这些著名类库的代码中,经常并不是用 . 来表示任意字符,而是使用 [\w\W] 或者 [\s\S]。乍一看,好像表达的含义是一样的,可是为什么放着简单的方法不用,而去多绕个圈子?今天就简单说说这个问题。

首先我们必须要正确理解 . 的含义。其实说它表示任意单个字符,可能会让人产生误解,必须要强调一下,这个“任意单个字符”不包括控制换行的字符,也就是不包含 \n\r\u2028\u2029 这几个字符。而 \W\s 中是能够包含这些字符的。那个这两种写法的差异也就很清晰了,就是能否匹配到几个换行控制符的差异。

那么在什么时候我们需要考虑这几个换行控制符呢?当要处理的字符串可能包含换行时。这样的情景太多了,处理 html 字符串、处理 template、Node.js 读取文本等等。

提及多行文本的场景,我们很容易想到正则表达式的 m 模式(多行模式)。那么多行模式对我们今天讨论的问题有影响吗?我不是很确定。为什么不确定呢?有些人信誓旦旦地声称单行模式下 . 的含义与多行模式下不同,单选模式下等同于 [\w\W] 或者 [\s\S],而多行模式下会排除换行控制符。但据我试验,以及参考 MDN 的说法,这是不对的。的确有很多语言的正则表达式会有上述特性,但在 javascript 中我没有看到,不知道会不会有浏览器方面的差异。那么多行模式对于 javascript 而言影响的是什么呢?我认为仅仅是改变了 ^$ 标识的含义:单行模式下,分别表示整个字符串的开始的结尾;多行模式下表示每一行的开始和结尾。而不管多行模式还是单行模式,我认为 . 都是不包含换行控制字符的,等价于 [^\n\r\u2028\u2029]

再多延伸一点点,对于现代浏览器,可以直接用 [^] 来匹配任意字符的。

例子程序不想写了,有兴趣的可以自己试验一下,分别用 /.*/g/^.*$/g/.*/gm/^.*$/gm 来匹配一下 "abc\nedf",其中道理不言自明。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。