只讨论验证方面的。
首先,验证方法可有二种,正则的test和String的search,选用哪个?显然选用test好,使用search的一定是没去对比的或拷贝代码的。
其次,讨论验证思路。正常的验证思路是:先验证是否完全匹配,否就提示错误。写法上,就是以^开头,然后以+$或*$或?$结尾。如果用逻辑表达式写即^(p),而^(p) = (^p),那么,(^p)表示的是什么验证思路呢?
只要找到不符合的,那么就提示错误。这种验证思路的写法,可以避免^+*?$等量词的使用。用例子来做说明吧,方便对比。比如验证只能输入数字:
//正常思维的写法
var exp = new RegExp();
exp = /^\d+$/;
if( !exp.test("2a2") ){
alert("只能输入数字");
return false;
}
//逆向思维的写法
exp = /\D/;
if( exp.test("2a2") ){ //注意无感叹号
alert("只能输入数字");
return false;
}
这个例子可以很清晰的说明区别了,从写法上看:逆向写法很简洁,没有+*?等数量量词,没有$结尾量词,一般也没有^开头量词(多条件的除外),并且if验证中,不再用"非"判断。下面再举几个例子,就更好看出逆向写法的简洁性了。为了简洁,不再写出if判断:
//只能输入数字:
exp = /^[0-9]+$/; //入门级的菜鸟写法
exp = /^\d+$/; //使用量词的写法
exp = /\D/; //改进
//只能字母
exp = /^[a-zA-Z]+$/; //一般写法
exp = /[^a-zA-Z]/; //改进
//只能输入单词字符(字母数字或_)
exp = /^[a-zA-Z0-9\_]+$/ //入门级的菜鸟写法
exp = /^\w+$/; //使用量词的写法
exp = /\W/; //改进
//只能输入单词字符(字母数字或_),并且不以数字开头
exp = /^[a-zA-Z]\w*$/; //一般写法
exp = /\W|^\d/; //改进
看出逆向写法的简洁性了吧?对此我进行了一些总结,不过发现,逆向写法的适用范围郁闷不大哎!像邮箱地址等某位必须固定的有顺序问题的多条件的正则表达式,用逆向写法反而可能会变得非常复杂了!如果不考虑顺序问题:^(pq)=(^p)|(^q)(三个或三个以上的省略)还可以接受,而如果考虑顺序问题(比如邮箱地址@有顺序问题),那几乎都不可写了!像上面的最后一个例子,如果所有条件都可以转为简单的量词,那么可以进行优化,如果不是,那就不要使用逆向写法了。当然,用逆向写法写多条件的表达式,阅读上也会引起理解上的问题。故:单条件的正则,或可转为简单量词的多条件正则,均可优化为逆向写法!
编辑了下,添加了附件,经理说总结的东西都写成ppt方便培训和交流。
分享到:
相关推荐
#### 二、正则表达式的基本元素 正则表达式由以下几类基本元素构成: 1. **普通字符**:例如字母、数字等,代表自身。 2. **元字符(Metacharacters)**:具有特殊含义的字符,如`^`、`$`、`.`、`*`、`+`、`?`、`{...
二、正则表达式测试工具 正则表达式工具(如压缩包中的"正则表示式工具.exe")是开发者和文本处理人员的重要助手,可以帮助用户测试和调试正则表达式。这类工具通常具有以下功能: 1. 输入框:用户可以在其中输入...
因此,在实际应用中,建议根据具体需求调整正则表达式的写法。 2. **性能考虑**:频繁地使用正则表达式可能会对性能造成一定影响,尤其是在大量数据的处理上。因此,在设计时应当考虑到这一点。 3. **用户友好性**:...
本文将详细介绍Java中常用的正则表达式写法及其四种主要功能:匹配、提取、分割以及替换。 #### 二、Java正则表达式基础 在Java中,`java.util.regex`包提供了用于处理正则表达式的类库,主要包括`Pattern`、`...
首先,有两类创建正则表达式的常见方法: 1. 字面量写法:使用斜杠 `/` 表示正则表达式的开始和结束,例如 `/^\d+$/` 用来匹配一个或多个数字。 2. 内置构造函数写法:通过 `new RegExp('xyz')` 实例化一个正则...
#### 二、.NET正则表达式引擎的工作特点 .NET正则表达式引擎的设计考虑了性能和灵活性,它具有以下显著特点: ##### 2.1 贪婪匹配原则 .NET框架的正则表达式引擎默认采用贪婪匹配策略,即尽可能多地匹配字符。...
下面详细介绍这两类正则表达式中的元字符: ##### 基本集(适用于`grep`) 1. **`^`**:锚定行的开始。例如,`'^grep'`匹配所有以`grep`开头的行。 2. **`$`**:锚定行的结束。例如,`'grep$'`匹配所有以`grep`...
正则表达式中的一些元字符和预定义类: - `\s`:匹配任何空白字符,包括空格、制表符、换页符等。 - `\S`:匹配任何非空白字符。 - `\d`:匹配任何数字,等价于`[0-9]`。 - `\D`:匹配任何非数字字符,等价于`[^0-9]...
#### 二、JavaScript中的正则表达式 在JavaScript中,正则表达式有两种表示方式: 1. **字面量表示法**: ```javascript var regex = /pattern/flags; ``` 2. **构造函数表示法**: ```javascript var regex...
Delphi作为一种流行的编程语言,内置了支持正则表达式的组件——`TPerlRegEx`类,这使得开发者可以方便地在其应用程序中集成正则表达式功能。 #### 二、`TPerlRegEx`简介 `TPerlRegEx`类是Delphi中用于处理正则...
这个库提供了`std::regex`类以及一系列相关的函数,如`std::regex_match`, `std::regex_search`等,使得开发者可以方便地在C++程序中集成正则表达式的能力。 #### 三、正则表达式元字符详解 下面详细介绍正则...
代码中还给出了另一种写法`String regex2="[1-9]\\d{4,14}"`,这里用到了`\\d`,它是正则表达式中表示数字的特殊字符(等同于`[0-9]`),同样能够匹配5到15位的QQ号码。注意,因为在Java字符串中,`\`是一个转义字符...
Java Database Connectivity (JDBC) 是一套用于执行 SQL 语句的 Java API,它可以为多种关系型数据库提供统一访问,它由一组用 Java 编程语言编写的类和接口组成。JDBC 提供了一种基准机制,无论哪种数据库被访问,...
**ReX.js库详解:构建复杂正则表达式的利器** 在JavaScript开发中,正则表达式(Regular Expression,简称RegEx)是一种强大的文本处理工具,用于查找、替换或提取字符串中的模式。然而,复杂的正则表达式往往难以...
正则表达式在C#中被封装在`System.Text.RegularExpressions`命名空间中,我们可以使用`Regex`类来进行匹配和替换操作。在本例中,我们需要编写一个正则表达式模式来识别数字的每一位,并用相应的中文大写字符替换...