热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于正则表达式对象test()方法的问题

WriteByMonkeyfly以下内容均为原创,如需转载请注明出处。前提今天在看别人自定义的一个必填项的表单验证的方法时,发现一个问题ÿ

Write By Monkeyfly

以下内容均为原创,如需转载请注明出处。

前提

今天在看别人自定义的一个必填项的表单验证的方法时,发现一个问题:

HTML代码:

//data-empty 自定义的属性 存在的话 说明是必填项 不存在 则说明不是必填的
<input type&#61;"text" placeholder&#61;"存在data-empty属性" data-empty&#61;"请输入用户名" >
<input type&#61;"text" placeholder&#61;"没有data-empty属性" >
<input type&#61;"text" placeholder&#61;"请输入手机或电话" data-empty&#61;"请输入手机或电话" data-pattern&#61;"^((0\d{2,3}-?\d{7,8})|(1[35784]\d{9}))$" >

jQuery代码&#xff1a;

$(function(){$("input").on(&#39;blur&#39;, function(event) {//错误信息的提示内容&#xff0c;已经提前在data-empty属性中定义好了var empty &#61; $(this).attr("data-empty");//如果文本框的值为空&#xff0c;则进行弹窗提示if($(this).val() &#61;&#61;""){if(empty){//弹窗提示 data-empty 中已定义好的错误提示信息&#xff08;代码省略了&#xff09;setTimeout(function(){//1.5秒后移除该弹框提示&#xff08;代码省略了&#xff09;},1500)}else{//如果文本框的值为空&#xff0c;而且没有data-empty属性&#xff0c;说明它不是必填项&#xff0c;则不用写else语句alert("该文本框没有data-empty属性");//写else语句仅仅为了测试}}//下面的正则验证&#xff0c;仅仅用于联系方式文本框&#xff08;因为只适用于存在data-pattern属性且值不为空的情况&#xff09;var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );if( $(this).val() && !result){//弹窗提示“格式错误”&#xff0c;且1.5s后自动消失setTimeout(function(){//1.5秒后移除该弹框提示&#xff08;代码省略了&#xff09;},1500)}});
}

说明&#xff1a;

  • 其实刚开始看时&#xff0c;愣是没看明白正则验证的前3行代码&#xff0c;不知道 result的值何时为true &#xff0c;何时为false
  • 在查看了正则表达式相关知识和进行了相关的代码测试之后&#xff0c;才算是真正明白了。

分析&#xff1a;

  • 首先&#xff0c;我们要知道RegExp 对象表示正则表达式&#xff0c;它是对字符串执行模式匹配的强大工具。
  • 其次&#xff0c;我们要知道创建 RegExp 对象的语法&#xff1a;new RegExp(pattern, attributes);
  • 参数说明&#xff1a;
    • pattern&#xff1a;本意为模式&#xff0c;它是一个字符串&#xff0c;表示一种正则表达式的匹配模式&#xff0c;也可以是自定义的正则表达式。
    • attributes&#xff1a;【可选参数】本意为属性&#xff0c;是一个可选的字符串&#xff0c;包含3种属性&#xff1a;"g"、"i" 和 "m"。分别是&#xff1a;全局匹配、忽略大小写匹配和多行匹配。
    • 注&#xff1a;如果 第一个参数pattern 是正则表达式&#xff0c;而不是字符串&#xff0c;则必须省略该参数。
  • 返回值&#xff1a;一个新的 RegExp 对象&#xff0c;具有指定的模式和标志&#xff08;"g"、"i" 或 "m"&#xff09;。
  • 正则表达式对象的方法&#xff1a;
    • test()方法用于检测一个字符串是否匹配某个模式。&#xff08;模式就是创建正则表达式对象时传入的字符串参数&#xff09;
    • 语法&#xff1a;正则表达式对象.test(string)
    • 返回值&#xff1a;如果字符串 string 中含有与 正则表达式对象 匹配的文本&#xff0c;则返回 true&#xff0c;否则返回false

//1.首先看前两行代码&#xff0c;拆开来看var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );
//它可以看成是这两部分的结合&#xff0c;我们一一来判断它们值可能出现的情况。var pattern &#61; new RegExp( );//创建一个正则表达式对象//括号内需要传递一个参数&#xff0c;指的是要匹配字符串的模式&#xff0c;即自定义的字符串过滤或称验证规则。var result &#61; pattern.test( $(this).val() ); //一般是结合正则表达式对象的test方法来使用。$(this).attr(&#39;data-pattern&#39;)//获取该对象的自定义属性值

测试过程1&#xff1a;

var p &#61; new RegExp();
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("aae"); //true

var p &#61; new RegExp("");
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("asd"); //true

var p &#61; new RegExp(undefined);
console.log(p); /(?:)/
p.test(""); //true
p.test("123"); //true
p.test("1234aae"); //true

var p &#61; new RegExp("undefined");
p.test("123"); //false
p.test("asd"); //false

var p &#61; new RegExp(null);
p.test("123"); //false
p.test("asd"); //false

测试结果1&#xff1a;

  • 对于正则表达式对象p来说&#xff0c;如果创建对象时传入的字符串参数为空&#xff08;""&#xff09;&#xff0c;传入一个undefined&#xff0c;或者没传任何参数&#xff0c;此时调用它的test()方法能匹配到任何字符串&#xff0c;因此test()方法的返回值都为true。&#xff08;这相当于匹配的模式为""undefined值、或无模式&#xff09;

总结&#xff1a;pattern对象对空字符串("")undefined值、空值的处理&#xff0c;都会导致test()方法返回true

测试过程2&#xff1a;

//如果属性不存在&#xff0c;则返回undefined类型
"text" >
var empty &#61; $(this).attr("data-empty"); //empty &#61; undefined
console.log(typeof empty); //undefined

//如果属性存在&#xff08;不管是否为空&#xff09;都返回string类型
<input type&#61;"text" data-empty&#61;"" >
var empty &#61; $(this).attr("data-empty"); //empty &#61; ""
console.log(typeof empty); //string

测试结果2&#xff1a;如果自定义属性存在&#xff0c;则返回string类型&#xff0c;如果自定义属性不存在&#xff0c;则返回undefined类型。

现在&#xff0c;这个问题就迎刃而解了

//可以这么说&#xff1a;此处只适用于存在data-pattern属性且值不为空的情况var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );//如果不存在data-pattern属性&#xff0c;result只会返回true。//要进行正则验证&#xff0c;输入框内肯定有值&#xff0c;所以 $(this).val() &#61;&#61; true//!result 恒为 false//true && false &#61;&#61; false //所以&#xff0c;只要不存在该属性&#xff0c;if语句是不会执行的if( $(this).val() && !result){//code...}


推荐阅读
  • 本文记录了 JavaScript 中正则表达式的使用方法和常见操作,包括匹配、替换、搜索等。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在使用 jQuery 的 `html()` 方法时,我发现了一个奇怪的现象:该方法无法完整地插入指定的字符串内容。具体来说,当尝试插入较长或包含特殊字符的字符串时,部分内容可能会被截断或丢失。这一问题可能与 jQuery 对字符串的处理方式有关,建议在实际应用中进行充分测试以确保数据完整性。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • JavaScript最初并非设计为纯粹的面向对象编程(OOP)语言,因为直到ES5标准中仍未引入类的概念。然而,随着ES6的发布,JavaScript正式引入了类的语法,使得开发者能够更加直观地实现继承机制。本文将深入探讨JavaScript中多样的继承实现方法,包括原型链、寄生组合式继承等技术,并分析它们的优缺点及适用场景。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 在深入研究 UniApp 封装请求时,发现其请求 API 方法中使用了 `then` 和 `catch` 函数。通过详细分析,了解到这些函数是 Promise 对象的核心组成部分。Promise 是一种用于处理异步操作的结果的标准化方式,它提供了一种更清晰、更可控的方法来管理复杂的异步流程。本文将详细介绍 Promise 的基本概念、结构和常见应用场景,帮助开发者更好地理解和使用这一强大的工具。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
author-avatar
寻找初心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有