正则表达式

一、正则表单式的作用

1.1 校验内容的有效性

String str = "163yin.weiwei@qq.com";
String regex = "^[\\w-]+(\\.[\\w-]+)*@([\\.\\w-]+)+$";
boolean result = Pattern.matches(regex, str);

1.2 替换内容

示例1:将url解析为a标签

String str = "这是测试的文本[url = baidu.com]百度[/url],结束";
String pattern = "\\[url\\s+=\\s+(.*?)\\](.*?)\\[\\/url\\]";
str = str.replaceAll(pattern, "<a href='$1'>$2</a>");    // $1, $2是指pattern中第一对小括号和第二对小括号匹配的内容,序号从1开始
System.out.println(str); // 这是测试的文本<a href='baidu.com'>百度</a>,结束

示例2:将远程地址网页内容中的src和href的内容前面添加远程url的地址

String urlParent = url.substring(0, url.lastIndexOf("/")+1);
String pattern = "(\\s+)src=\"((?!http[s]?:)[./]*[a-zA-Z0-9._\\-\\/]+)";
content = content.replaceAll(pattern, "$1src=\"" + urlParent + "$2");

pattern = "(\\s+)href=\"((?!http[s]?:)[./]*[a-zA-Z0-9._\\-\\/]+)";
content = content.replaceAll(pattern, "$1href=\"" + urlParent + "$2");
return content;

1.3 获取内容

示例1: 获取title的值

String str = "<a href=\"/book/1485278.html\" title=\"Think in Java\">";
Pattern p = Pattern.compile("title=\"(.*?)\"");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(m.group(1));   // 输出 Think in Java
}

示例2:解析出某些位置的文字

String str = "{if(a=1)}a等于1{endif}这是混淆的文字{if(a>5)}a大于5{endif}结束";
String matcher="\\{if\\((.*?)\\)\\}(.*?)\\{endif\\}";
List<List<String>> analysis = analysis(matcher, str);    //[[a=1, a等于1], [a>5, a大于5]]

public static List<List<String>> analysis(String matcher, String str) {
      List<List<String>> list = new ArrayList<List<String>>();

      Matcher m = Pattern.compile(matcher).matcher(str);
      while (m.find()) {
            List<String> row = new ArrayList<>();
            for (int i = 0; i < m.groupCount(); i++) {
                  row.add(m.group(i + 1));
            }
            list.add(row);
      }
      return list;

}

二、正则表达式的语法

*   匹配前面的子表达式零次或多次

+  匹配前面的子表达式一次或多次

?  匹配前面的子表达式零次或一次

{n}  n 是一个非负整数。匹配确定的 n 次

{n,}  n 是一个非负整数。至少匹配n 次

{n,m}  m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

?  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

.  匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式

(?!pattern)    负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。

[a-z]  字符范围。匹配指定范围内的任意字符

 \d  匹配一个数字字符。等价于 [0-9]。

 \D  匹配一个非数字字符。等价于 [^0-9]。

 \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

 \S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

 \w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

\W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

^[a-zA-Z]\w{5,17}$  以字母开头,长度在6~18之间,只能包含字符、数字和下划线

更多细节请参考http://www.cnblogs.com/Mainz/archive/2009/03/14/1411359.html

[\w-]是什么意思? \w 匹配任意单词字符   -   匹配-,即匹配 任一单词字符或一个 -

[\w]+和\w+没有区别,都是匹配数字和字母下划线的多个字符

[\w+]表示匹配数字、字母、下划线和加号的单个字符

可以使用在线工具对正则表达式进行验证,如http://tool.oschina.net/regex/

本文内容到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值