正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),即"描述某种规则的表达式",是计算机科学的一个概念。
一个正则表达式通常被称为一个模式(pattern),是用来描述或者匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。我们说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。
1.正则表达式基础
正则表达式中需要注意的知识点如下,
1) 元字符 - 特殊含义的字符
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
Tips: 如果想查找元字符本身,比如查找.或者*,这时就得使用转义字符\,即使用\.和\*。当然,要查找\本身,也得用\\.
2) 限定符 - 限定重复次数
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
3) 字符组 - 匹配若干字符、匹配范围
[] //字符串用中括号[]括起来,表示匹配其中的任一字符,如[aeIoU]就匹配任何一个英文元音字母,[.?!]匹配标点符号.或?或!。
- //连字符-表示一个范围,[0-9]与[0123456789]意思相同,类似的还有[a-z],[A-Z]。
4) 多选结构 - 分支条件
| //用|把不同的规则分隔开,它的意思是或。如gray|grey 既可匹配gray又可匹配grey,相当于gr[ae]y
5) 反义符
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeIoU] 匹配除了aeIoU这几个字母以外的任意字符
2.正则表达式示例
1)Java中正则表达式处理示例
Java中,可使用java.util.regex包(since JDK1.4)中的Pattern类和Matcher类处理正则表达式,下面是2个简单的示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * 正则表达式处理示例 * */ public class TestRegex { public static void main(String[] args) { //定义模式 Pattern pattern = Pattern.compile("a\\sb.*c");// space: " " or "\\s" //定义匹配器 Matcher matcher = pattern.matcher("hello a b123c world!"); //匹配检测,整个输入序列与该模式匹配时,才返回true System.out.println(matcher.matches());//false //如果找到匹配的子字符串,则打印出来 if(matcher.find()){ System.out.println(matcher.group());//a b123c } //也可直接进行模式匹配 boolean b = Pattern.matches("a*b","aaab"); System.out.println(b);//true } }
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * 正则表达式处理示例2 * */ public class TestRegex2 { public static void main(String[] args) { Pattern p = Pattern.compile("a(.+?)c"); Matcher m = p.matcher("abcaddcacd"); while (m.find()) { String s = m.group(); //group是针对()来说的 //group(0)指匹配出的整个串 String s0 = m.group(0); //group(1)指的是第1个括号里的东西 String s1 = m.group(1); //依次输出: //abc||abc||b //addc||addc||dd System.out.println(s + "||" + s0 + "||" + s1); } //匹配器重置输入序列 m.reset("axxc!"); while (m.find()) { System.out.println(m.group());//axxc } } }
2)JavaScript中正则表达式处理示例
在JavaScript中,可以通过内建的Regex类来声明一个正则表达式,如: var regex = new RegExp("a"); 也可用字面量的声明方式,如: var regex = /a/;
声明时可以使用额外的参数i,g或m指定处理方式,含义如下:
i - 执行对大小写不敏感的匹配
g - 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m - 执行多行匹配
刚才的例子中,如果需要忽略大小写,则应该这样定义:
var regex = new RegExp("a","i");
var regex = /a/i;
Regex对象中可用的方法如下:
compile() - 编译正则表达式
exec() - 检索字符串中指定的值,返回找到的值,并确定其位置
test() - 检索字符串中指定的值,返回true或false
支持正则表达式的String对象的方法如下:
match() - 找到一个或多个正则表达式的匹配
replace() - 替换与正则表达式匹配的子串
search() - 检索与正则表达式相匹配的值
split() - 把字符串分割为字符串数组
下面是几个简单的正则表达式处理示例,
/** * 判断是否为空串或null. * @param argValue 检测对象 * @return 检测结果 */ function eValidateEmpty(argValue) { // argValue为空串或null,返回true return argValue == null || argValue == ""; } /** * 去除字符串首末空格后,判断是否为空串或null. * @param argValue 检测对象 * @return 检测结果 */ function eValidateEmpty2(argValue) { // argValue为空串或null,返回true argValue = eTrim(argValue); return argValue == null || argValue == ""; } /** * 去除字符串首末空格. * @param argValue 操作对象 * @return 去除首末空格的字符串 */ function eTrim(argValue) { if (eValidateEmpty(argValue)) { return ""; } return argValue.replace(/^(\s| )*/,""). replace(/(\s| )*$/,""); } /** * 判断email格式. * @param argValue 检测对象 * @return 检测结果 */ function eValidateEmail(argValue){ if (eValidateEmpty(argValue)) { return false; } var result = argValue.match(/^\S+@\S+\.\S+$/); if(!result) { return false; } return true; } /** * 判断电话号码格式. * @param argValue 检测对象 * @return 检测结果 */ function eValidatePhone(argValue) { if (eValidateEmpty(argValue)) { return false; } var reg=/(^(\+|\-)[0-9]{2}[0-9]{3,4}\-[0-9]{7,8}$)|(^[0-9]{3,8}$)|(^[0-9]{7,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/; if (!reg.test(argValue)) { return false; } return true; } /** * 判断URL格式. * @param argValue 检测对象 * @return 检测结果 */ function eValidateURL(argValue) { if (eValidateEmpty(argValue)) { return false; } var regExp=new RegExp(/^http\:\/\/\w+(\.\w+)*(\/\w+)*(\?\w+=\w*(&\w+=\w*)*)?$/g); if (argValue.match(regExp)==null) { return false; } return true; } /** * 根据给定的格式(正则表达式),进行判断. * @param argValue 检测对象 * @param mask 正则表达式 * @return 检测结果 */ function eValidateMask(argValue,mask) { var isValid = true; var value = eTrim(argValue); if (eValidateEmpty(value) || eValidateEmpty(mask)) { return false; } if (!mask.exec(value)) { isValid = false; } return isValid; }参考资料: 正则表达式30分钟入门教程 http://deerchao.net/tutorials/regex/regex.htm
正则表达式(一) -- 元字符 http://www.cnblogs.com/kissdodog/archive/2013/04/22/3036649.html