正则表达式在我们的开发过程中还是比较经常用到的,就我们项目组而言,正则表达式主要应用于以下几个方面:
Ø Java代码中(包含数据库中存储参数的校验规则);
Ø JavaScript代码中;
当正则表达式中有特殊字符需要转义时,就需要使用反斜杠“\”来对特殊字符进行转义了,问题是到底用单个反斜杠还是双反斜杠,这一点是我们容易混淆的,下面就从以上两个方面来进行简要的说明。
一、Java代码中的使用
我们在Java代码中主要通过两种方式使用正则表达式:一种是将一个正则表达式直接赋值给一个String变量;另外一种就是将正则表达式存于数据表中,通过Java代码读取数据库并进行校验;
对于第一种方式,当我们需要对特殊字符进行转义时,需要使用双反斜杠“\\”,例子如下(以IP校验规则为例):
String testStr = "0.1.2.3";
String regx =
"^((0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.(0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(/(8|16|24|32))?)$";
Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(testStr);
在以上代码中,双斜杠“\\”对特殊字符“.”(英文句点)进行了转义。
对于第二种方式,存于数据表中的正则表达式,如果需要对特殊字符转义,则需要使用单反斜杠“\”,例如我们在数据库中查看参数sysRequestAuthIP的校验规则:
上面存于数据表中的正则表达式中,使用单反斜杠“\”分别对特殊字符“.”(英文句点)和“|”(竖线)进行了转义。
二、JavaScript代码中的使用
在JavaScript代码中,我们一般也会主要通过两种方式使用正则表达式:一种是使用RegExp对象,另外一种方式是使用/xxx/这种方式。
对于第一种方式,如果正则表达式中有特殊字符需要转义,则需要使用双反斜杠“\\”,例子如下(以IP校验规则为例):
var str = "0.1.2.3";
var reg =
"^((0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.(0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(/(8|16|24|32))?)$";
var exp = new RegExp(reg);
alert(exp.test(str));
在以上JavaScript代码中,使用RegExp对象编译含特殊字符的正则表达式时,是使用双反斜杠“\\”对特殊字符“.”(英文句点)进行转义的。
对于第二种方式,如果需要对特殊字符进行转义,则需要使用单反斜杠“\”,例如(以IP校验规则为例):
var str = "0.1.2.3";
var reg =
/^((0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(\/(8|16|24|32))?)$/;
alert(reg.test(str));
在以上代码中,使用单反斜杠“\”分别对“.”(英文句点)和“/”(正斜杠)进行了转义。
以上内容是对之前所修改的校验规则问题进行的简单总结,另外,顺便提一下在Linux指令中替换字符串时,如果字符串中含特殊字符,是需要使用单反斜杠“\”对特殊字符进行转义的。比如我们在搭建ISap平台的管理Portal修改配置文件persistence.ext.xml(${PORTAL_HOME}/conf/server目录下)中的密码时,如果密码中含特殊字符,我们就需要使用单反斜杠“\”对特殊字符进行转义:
在上面的替换指令中,密码u9dFQ/RLv4dPWtA+V7tWfQ==中的特殊字符“/”就是使用单反斜杠“\”进行转义的。