正则表达式——java
-
什么是正则表达式?
记录文本规则的代码。精确描述出我们对于字符串的特殊需求。
例如:电话号码 010-12345678 010-87654321 有什么相似之处?
它们的相似之处就是形式都是像这样 XXX-XXXXXXXX(X为数字)
在一段段纷繁复杂的文字中,我们可不可以只把电话号码筛选出来呢?利用正则表达式,我么可以轻松做到。
为了方便学习,在学习的过程中你可以通过[在线正则表达式测试系统](http://tool.oschina.net/regex/进行测试来看看你的正则表达式是否正确。
-
常用正则表达式符号
正则表达式的符号有很多,
(1) 首尾匹配:^ 和$
^表示开始:“abc12" 和 ”^abc" 匹配
$表示结束:“12abc" 和 "abc$” 匹配
当然 “abc"既能和"abc12",也能和"12abc"匹配.
那猜猜”^abc$"呢?
那就只能和"abc"匹配了。
(2) 字符匹配次数 * + ? {}
“ab*”: *表示没有或者更多 如可以与 abc , ac ,abbbbbbbbddd匹配
“ab+”:+表示一个或者多个 可以与abc,abbbbbbbbbccccc,但不能与ac匹配
”ab?": 表示一个或者0个
注意区分:”ab" 与"ab+",当同时与 abbb匹配时,“ab"匹配结果是ab,但"ab+“匹配结果是"abbb”
那要是有确定的匹配次数怎么办?
比如我要找电话号码,我们知道是3个数字+‘_’+8个数字,这里我们就能用到**{}**来匹配了。
b{3}表示b匹配3次,b{3,5}表示b匹配3-5次(包含端点),b{3,}表示3次及以上,注意正则表达式不能不设下限,如b{,4}是错误的。
(3) 或者 | []
[ab]:a或者b
(b|cd)e: be或者cde都能匹配上
(b|cd)*e:表示b,cd 任意混合加上e都能匹配
中划线-与[ ]同用可以指定范围
[a-z]:a到z
[0-9]:0到9
[a-zA-Z0-9]$ :以字母或者数字结尾
[^a-z]:除了a-z之外的字符
^()${}|等有意义的字符要表示本身需要在前面加上\表示转义
(4) .可以代替任意字符
-
特殊符号
\w:[a-zA-Z0-9]
\W:与\w相反
\d:[0-9]
\D:与\d相反
-
java中正则表达式的使用
我们先上例子
这里我们匹配像{{1,2},{3,4}}的字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class regx { public static void main( String args[] ){ // 按指定模式在字符串查找 String line = "{{+1,2}, {3,4}"; line=line.replace(" ",""); String pattern = "^[{][{][+-]?\\d+[,][+-]?\\d+[}][,][{][+-]?\\d+[,][+-]?\\d+[}][}]$"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern); // 现在创建 matcher 对象 Matcher m = r.matcher(line); int i = 0; if (m.find( )) { System.out.println(m.group()); } else { return; } } }
框架:
pattern =" " Pattern r=Pattern.compile(pattern) Matcher m = r.matcher(ori_str) if(m.find()) ...... \\用while(m.find())可以实现不断的向后匹配