温故知新: 正则表达式简记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangnan537/article/details/46606275

正则表达式(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
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页