`
zui4yi1
  • 浏览: 3043 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

二类正则表达式的优化写法

 
阅读更多

      只讨论验证方面的。
    首先,验证方法可有二种,正则的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. 输入框:用户可以在其中输入...

    winform中利用正则表达式

    因此,在实际应用中,建议根据具体需求调整正则表达式的写法。 2. **性能考虑**:频繁地使用正则表达式可能会对性能造成一定影响,尤其是在大量数据的处理上。因此,在设计时应当考虑到这一点。 3. **用户友好性**:...

    java中的正则表达式

    本文将详细介绍Java中常用的正则表达式写法及其四种主要功能:匹配、提取、分割以及替换。 #### 二、Java正则表达式基础 在Java中,`java.util.regex`包提供了用于处理正则表达式的类库,主要包括`Pattern`、`...

    js限制文本框只能输入数字(正则表达式).docx

    首先,有两类创建正则表达式的常见方法: 1. 字面量写法:使用斜杠 `/` 表示正则表达式的开始和结束,例如 `/^\d+$/` 用来匹配一个或多个数字。 2. 内置构造函数写法:通过 `new RegExp('xyz')` 实例化一个正则...

    NET正则表达式使用高级技巧之工作特点

    #### 二、.NET正则表达式引擎的工作特点 .NET正则表达式引擎的设计考虑了性能和灵活性,它具有以下显著特点: ##### 2.1 贪婪匹配原则 .NET框架的正则表达式引擎默认采用贪婪匹配策略,即尽可能多地匹配字符。...

    正则表达式grep[global search regular expression]

    下面详细介绍这两类正则表达式中的元字符: ##### 基本集(适用于`grep`) 1. **`^`**:锚定行的开始。例如,`'^grep'`匹配所有以`grep`开头的行。 2. **`$`**:锚定行的结束。例如,`'grep$'`匹配所有以`grep`...

    JS经典正则表达式笔试题汇总

    正则表达式中的一些元字符和预定义类: - `\s`:匹配任何空白字符,包括空格、制表符、换页符等。 - `\S`:匹配任何非空白字符。 - `\d`:匹配任何数字,等价于`[0-9]`。 - `\D`:匹配任何非数字字符,等价于`[^0-9]...

    JavaScript与Java正则表达式写法的区别介绍

    #### 二、JavaScript中的正则表达式 在JavaScript中,正则表达式有两种表示方式: 1. **字面量表示法**: ```javascript var regex = /pattern/flags; ``` 2. **构造函数表示法**: ```javascript var regex...

    Delphi正则表达式应用[文].pdf

    Delphi作为一种流行的编程语言,内置了支持正则表达式的组件——`TPerlRegEx`类,这使得开发者可以方便地在其应用程序中集成正则表达式功能。 #### 二、`TPerlRegEx`简介 `TPerlRegEx`类是Delphi中用于处理正则...

    正则表达式

    这个库提供了`std::regex`类以及一系列相关的函数,如`std::regex_match`, `std::regex_search`等,使得开发者可以方便地在C++程序中集成正则表达式的能力。 #### 三、正则表达式元字符详解 下面详细介绍正则...

    正则表达式对qq号码校验

    代码中还给出了另一种写法`String regex2="[1-9]\\d{4,14}"`,这里用到了`\\d`,它是正则表达式中表示数字的特殊字符(等同于`[0-9]`),同样能够匹配5到15位的QQ号码。注意,因为在Java字符串中,`\`是一个转义字符...

    常用的数据库JDBC URL格式

    Java Database Connectivity (JDBC) 是一套用于执行 SQL 语句的 Java API,它可以为多种关系型数据库提供统一访问,它由一组用 Java 编程语言编写的类和接口组成。JDBC 提供了一种基准机制,无论哪种数据库被访问,...

    ReXjs一个能够帮助自动完成编写复杂RegEx的JS库

    **ReX.js库详解:构建复杂正则表达式的利器** 在JavaScript开发中,正则表达式(Regular Expression,简称RegEx)是一种强大的文本处理工具,用于查找、替换或提取字符串中的模式。然而,复杂的正则表达式往往难以...

    C# 人民币大小写转换

    正则表达式在C#中被封装在`System.Text.RegularExpressions`命名空间中,我们可以使用`Regex`类来进行匹配和替换操作。在本例中,我们需要编写一个正则表达式模式来识别数字的每一位,并用相应的中文大写字符替换...

Global site tag (gtag.js) - Google Analytics