正则表达式(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,4}\-[0-9]{7,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