正则表达式30分钟入门教程 http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
普通字符: 匹配相同的一个字符
简单的转义字符
\n 换行
\t 制表
\\ \本身
\^ \$ \. \( \) \{ \} \? \+ \* \| \[ \] 匹配字符本身
标准符集合
能够与多种字符匹配 注意大写 是相反的意思
\d 任意数字 0-9
\w 任意数字 下划线 A-Z a-z 0-9 _
\s 空格、制表符、换行等空白字符
. 小数点可以匹配任意一个字符(除了换行符),假如要匹配包括 \n 在内的字符 可以用 \s\S
自定义字符集合
[] 方括号匹配方式,匹配方括号中的任意一个字符
[abc123] 匹配 a b c 1 2 3
[^abc] 匹配非 a b c 的一个字符
[f-k] 匹配 f到k之间的任意字符
[^A-F0-3] 匹配非 A-F 0-3 的一个字符
特殊符号,在中括号中失去特殊意义 除了 ^ -
标准字符集合 ,在中括号中有效,除小数点
量词
修饰匹配的次数的特殊符号
{n} 重复n次
{m,n} 重复至少m次,最多n次
{m,} 至少m次
? 零次或者一次 非贪婪 等同于{0,1}
+ 至少一次 或者 任意次 贪婪 {1,}
* 零次 或者 任意次 {0,}
匹配次数中贪婪模式(匹配字符越多越好,默认)
匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后面再加上?号) 如 \d{1,6}?
字符边界
匹配的不是字符而是位置,符合某种条件的位置 0宽度
^ 匹配字符串开始
$ 匹配字符串结束的地方
\b 匹配一个单词的边界 前面的字符和后面的字符 不全是\w 字母数字下划线
等于就是 与跟着的 字符不一样的 123.【】 123\b 是可以匹配到的
忽略大小写模式
匹配是忽略大小写
模式是要区分的
单行模式
整个文本看着一个字符串,只有一个开头,一个结尾
使小数点 . 可以匹配包含换行符\n在内的任意字符
多行模式
每行都是一个字符串,都有开头和结尾
在指定了MULTLINE之后,如果需要仅匹配字符串开始和结束位置,可以使用\A 和 \Z
选择符和分组
| 分支结构 匹配 左边或者右边
() 捕获组
1》在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
2》去匹配结果的的时候,括号中的表达式匹配到的内容可以被单独得到
3》每一对括号会分配一个编号,使用()的捕获根据左括号顺序从1开始自动编号。捕获元素编号为零的第一个捕获是由整个表达式模式匹配的文本
(?:Expression) 非捕获组 举例 (?:[a-z]{2})
一些表达式中,不得不使用(),但又不需要保存()中自表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用
命名分组 (?<name>xxx)
反向引用(\nnn)nnn表示数字
每一对()会分配一个编号,使用()的不会根据左括号的顺序从1开始自动编号
通过反向引用,可以对分组已捕获的字符串进行引用
与搜索(零宽断言)
只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度
这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符,是对位置的匹配
正则表达式匹配过程中,如果子表达式匹配到的字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个表达式是零宽度的。占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。
(?=exp) 断言自身出现的位置的后面能匹配表达式exp [a-z]+(?=ing)
(?<=exp) 断言自身出现的位置的前面能匹配表达式exp
(?!exp) 断言自身出现的位置的后面不能匹配表达式exp
(?<!exp) 断言自身出现的位置的前面不能匹配表达式exp
个人理解: =后面是匹配 !是不匹配
java.uti.regex.Pattern
正则表达式的编译表示形式
Pattern p = Pattern.compile(r,int);//建立正则表达式,并启用相应的模式 r正则表达式
类Matcher
通过解释Pattern对 character sequence执行匹配操作的引擎
Matcher m = p.matcher(str); //匹配str字符串
boolean reslult = m.matches();//尝试将整个字符序列与该模式匹配
boolean result2 = m.find();//查找与该模式匹配的下一个子序列
m.group();返回找到的内容 group中填写分组编号 可取出对应分组数据
举例:
匹配模式为:([a-z])([0-9])
待匹配的字符串为: abc123
结果:
group(1) 的值为 abc
group(2) 则为 123
使用group获取数据前需先执行find方法
// 多次匹配
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\w+)");
String str = "aa|bb-cc|dd";
Matcher m = p.matcher(str);
if(!m.matches()){
System.out.print("没有匹配全部字符串");
}
// 存在部分匹配
while (m.find()) {
for (int i = m.groupCount(); i > 0; i--) {
System.out.println(m.group(i));
}
}
}
方式2:
String str = "测试文本123";
str.matches("\\d+");
m.replaceAll("#");//替换
String.split("\\d");//可以用正则切分