转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/48106091
本文出自:【M家杰的博客】
初学者视角:正则表达式是一种字符串搜索和匹配的工具
java中的关键类和方法
Pattern
类,正则表达式的编译表示形式。
Pattern.compile(String)
填写正则表达式
Pattern.compile(String,int)
填写正则表达式和修正模式的标识
Pattern.matcher(CharSequence)
填入目标字符串,返回Matcher
Pattern.matches(String, CharSequence)
直接填入正则表达式和目标字符串进行匹配。Matcher
类, 通过解释 Pattern 对 字符串 执行匹配操作的引擎。
Matcher.matches()
将整个字符串与模式匹配。
Matcher.find()
在字符串中查找匹配的下一个子串
Matcher.group()
返回匹配的字符串
Matcher.replaceAll(String)
将整个字符串中匹配的子串改为填人的字符串
Pattern 类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。
- 官方API例子:
//经典写法
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
//简便写法
boolean b = Pattern.matches("a*b", "aaaaab");
界定符
表示一个正则表达式的开始和结束
界定符的形式在不同语言中有所不用
Java中似乎不需要界定符
php中界定符为:/
或者#
或者{}
原子
- 可见原子(Unicode编码表中用键盘输出后肉眼
可见
的字符)
- 标点 ; ” _ ? . 等等
- 英文字母数字 a-z,A-Z,0-9
- 汉字、日文、阿拉伯文等其他语言文字
- 数理化公式等其他可见字符
- 不可见原子(Unicode编码表中用键盘输出后肉眼
不可见
的字符)
- 换行符 \n
- 回车 \r
- 制表符 \t
- 空格
- 等等其他不可见符号
元字符
|
匹配两个或者多个分支选择[]
匹配方括号中的任意一个原子[^]
匹配除方括号中的原子之外的任意字符.
任何字符(与行结束符可能匹配也可能不匹配)\d
数字:[0-9]\D
非数字: [^0-9]\s
空白字符:[ \t\n\x0B\f\r]\S
非空白字符:[^\s]\w
单词字符(注意包含下划线):[a-zA-Z_0-9]\W
非单词字符:[^\w]
|
和[]
的区别在于,|
是取左右的一整串字符串去匹配,[]
是取括号中的任意单个字符去匹配
特别的写法:
[ab]cd
匹配”acd”和”bcd”
量词
{n}
表示其前面的原子恰好出现n次{n,}
表示其前面的原子最少出现了n次{n,m}
表示其前面的原子最少出现n次,最多出现m次*
匹配0次、1次或者多次其之前的原子,等同于{0,}+
匹配1次或者多次其之前的原子,等同于{1,}?
匹配0次或者1次其之前的原子,等同于{0,1}
特别的写法:
A?K
匹配”AK”和”K”
边界控制
^
匹配字符串开始的位置$
匹配字符串结束的位置
^abcde$
表示整个字符串开始必须为”a”,结束必须为”e”
修正模式
1.贪婪匹配(默认)
匹配结果存在歧义时取其长
2.懒惰匹配
匹配结果存在歧义时取其短
JAVA开启懒惰匹配:好像没有专门的这种模式,只能自己写,使用:.*?
例如表达式:mjj.*?asd
匹配字段:mjj_-1asdasdasd
PHP开启懒惰匹配:在界定符号后面加大写U。例:/[0-9]/U
3.忽略英文字母大小写
JAVA开启:Pattern.CASE_INSENSITIVE
PHP开启:在界定符号后面加小写i。例:/[0-9]/i
4.忽略空白
JAVA开启:Pattern.COMMENTS
PHP开启:在界定符号后面加小写x。例:/[0-9]/x
5.让.
可以匹配换行符
JAVA开启:Pattern.DOTALL
PHP开启:在界定符号后面加小写s。例:/[0-9]/s
模式单元
()
模式单元的存在可以使对字符串的操作更加灵活
特别的写法:
(M|A)asd
匹配”Masd”和”Aasd”
java模式单元的例子:
String str = "mjj.mjjmjj@qq.com";
String regex = "^\\w+(\\.\\w+|\\-\\w+)*@\\w+(\\.\\w+)+$";
Matcher matcher = Pattern.compile(regex).matcher(str);
matcher.matches();
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
打印结果:
mjj.mjjmjj@qq.com
.mjjmjj
.com
例子中regex
表达式的整体为总模式,(\\.\\w+|\\-\\w+)
和(\\.\\w+)
为子模式。
可以从打印结果看出,我们可以利用模式单元方便的拆分出想要的子串
java中通过Matcher.group(int)
方法获取
注意事项
- 在匹配中文时会因为编码不同(UTF-8,GBK等等)而造成错误,比较好的解决方法是将表达式中的中文转为Unicode编码
- 在Java中特别需要注意
\
,php中写\d
在Java中写\\d
简单示例(JAVA)
非空:.+
两位浮点型:^\\d+\\.\\d{2}$
简单邮箱地址:^\\w+(\\.\\w+|\\-\\w+)*@\\w+(\\.\\w+)+$
简单的URL:^(https?://)?(\\w+\\.)+[a-zA-Z]+$