当前位置:文档之家› 正则表达式

正则表达式

1.简单认识正则表达式的概念
p("abc".matches("...")); .代表一个字符
p("a8729a".replaceAll("\\d", "-")); 反斜杠d代表的是一位数字,用两个反斜杠代表一个反斜杠。java中转义字符问题
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("[a-z]{3}"); 首先编译好一个正则表达式,这样其他需要的时候不需要现场编译,这样速度就快了
一共3个字母,每个字母都是a到z之间的
Matcher m = p.matcher("fgh"); Matcher叫匹配器,p就是一个模式,用它去匹配另外一个字符串,匹配的结果保留在m中
p(m.matches()); 查看它是否匹配,返回值是一个boolean类型
p("fgh".matches("[a-z]{3}")); 上面三句话合成的一句话,写三句话的效率高,因为它首先编译好了


2.初步认识. * + ? 这些在api的pattern的类里面都有说明
p("a".matches(".")); true
p("aa".matches("aa")); true, 在正则表达式里面也有说正常字符的匹配,并不是说都是特殊字符
p("aaaa".matches("a*")); true, *号代表0个或多个
p("aaaa".matches("a+")); true, +号代表一个或多个
p("".matches("a*")); true *号代表0个或多个
p("aaaa".matches("a?")); false, ?号代表一个或0个
p("".matches("a?")); true
p("a".matches("a?")); true
p("214523145234532".matches("\\d{3,100}")); true 必须是数字,3个到100个之间
p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")); false
p("192".matches("[0-2][0-9][0-9]")); true, []括号代表的是一个范围

3.范围
p("a".matches("[abc]")); 一个中括号代表的是匹配一个字符,中括号里面写得再长那么它也是匹配一个字符
p("a".matches("[^abc]")); false, 除了abc之外的
p("A".matches("[a-zA-Z]")); true, a到z 或者A到Z
p("A".matches("[a-z]|[A-Z]")); true, a到z 或者A到Z
p("A".matches("[a-z[A-Z]]")); true, a到z 或者A到Z
p("R".matches("[A-Z&&[RFG]]")); true, A到Z 并且是RFG中的一个

4.认识\s \w \d \
p(" \n\r\t".matches("\\s{4}")); true, 是否匹配四个空格
p(" ".matches("\\S")); false, \S表示非空白字符
p("a_8".matches("\\w{3}")); true, \w构成单词的字符
p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+")); true a到z中1到3个,数字1个或多个,&^#%中一个或多个
p("\\".matches("\\\\")); true

5.POSIX Style
p("a".matches("\\p{Lower}")); true

6.boundary
p("hello sir".matches("^h.*")); true, ^位于[]里面的时

候意思是取反,位于[]外面代表的是输入的开头,以h开头,后面是0个或多个字符
p("hello sir".matches(".*ir$")); true
p("hello sir".matches("^h[a-z]{1,3}o\\b.*")); true, \b代表的是单词边界
p("hellosir".matches("^h[a-z]{1,3}o\\b.*")); false

7.whilte lines(空白行)
p(" \n".matches("^[\\s&&[^\\n]]*\\n$")); true, 空白行,开始是空白但不是换行(一个或多个)结尾是一个换行

p("aaa 8888c".matches(".*\\d{4}.")); true
p("aaa 8888c".matches(".*\\b\\d{4}.")); true
p("aaa8888c".matches(".*\\d{4}.")); true
p("aaa8888c".matches(".*\\b\\d{4}.")); false

8.email
p("asdfasdfsafsf@https://www.doczj.com/doc/1f2390092.html,".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")); true

9.matches find lookingAt
注意matchers和find一起使用的时候会产生影响,此时应该使用reset方法恢复到初始状态
如果中间没有m.reset()的话那么第一个m.find()找到的将会是34345
因为第一个p.matcher(s)找到123-的时候发现不匹配,那么后面的将从-后面开始
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("\\d{3,5}"); 编译这个正则表达式
String s = "123-34345-234-00";
Matcher m = p.matcher(s); matchers匹配整个字符串
p(m.matches()); false
m.reset();
p(m.find()); find匹配的是字串
p(m.start() + "-" + m.end()); 将会输出0-3
p(m.find());
p(m.start() + "-" + m.end());
p(m.find());
p(m.start() + "-" + m.end());
p(m.find());
//p(m.start() + "-" + m.end()); 必须能找着的时候才能输出它的start和end方法,否则会报错
p(m.lookingAt()); true, lookingAt每次都从头开始找
p(m.lookingAt()); true
p(m.lookingAt()); true
p(m.lookingAt()); true

10.replacement
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("java", Pattern.CASE_INSENSITIVE); 大小写不敏感
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
StringBuffer buf = new StringBuffer();
int i=0;
while(m.find()) {
i++;
if(i%2 == 0) {
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); 把尾巴添上,不然后面的afasdfasdf将会没有
p(buf);

11.group (注意,有时候小括号套小括号,要看第几组的话,就看左括号的第几个即可)
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("(\\d{3,5})([a-z]{2})"); 分了几组就看有几对小括号,严格来说有3组,因为整个正则表达式算一组
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group());

直接打印出来正则表达式所匹配的那个子串:123aa 34345bb 234cc
m.group(1)只打印数字:123 34345 234
m.group(2)只打印字母:aa bb cc
}

12.qulifiers
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile(".{3,10}+[0-9]");
String s = "aaaa5bbbb68";
Matcher m = p.matcher(s);
if(m.find())
p(m.start() + "-" + m.end());
else
p("not match!"); 结果:0-11

13.non-capturing groups
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile(".{3}(?=a)"); 结果是444,以a为结尾,但是不捕获a,若是把?=a放前面的话结果是a66
String s = "444a66b"; ?!a放后面,结果:44a 66b,(首先找444,发现后面跟的是a,所以再找44a,发现后面不是a),若是放前面 444 66b
Matcher m = p.matcher(s); ?<=a 从后往前数是a的,结果是44a
while(m.find()) {
p(m.group());
}

14.back refenrences
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("(\\d(\\d))\\2"); \\d\\d\\1 首先找到12,后面的东西必须跟我前面找到的12一样。\\1表示的是第一个组找到的匹配的
String s = "122"; true,第二个组找到的是2,\\2是要后面的和第二个组的匹配
Matcher m = p.matcher(s);
p(m.matches());

15.flags的简写
Pattern p = https://www.doczj.com/doc/1f2390092.html,pile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)")); 上面的简写

相关主题
文本预览
相关文档 最新文档