Java 正则二 基本使用

二、Java正则表达式:

说明:位于Java.util.regex包中类Matcher与Pattern,需要掌握的3个对象是
String,Pattern,Matcher,他们都是final类对象。
其中String的matches()方法表示是否匹配给定的正则表达式对象,
类Pattern表示正则表达式的编译形式(字符串的匹配模式,需编译),
类Mathcher表匹配器。

2.1 Pattern类:

常用方法:
compile(String regex)将给定的正则表达式编译到模式中
返回Pattern编译模式对象
matcher(CharSequence input)表示匹配给定输入与此模式的匹配器
返回Matcher匹配器对象。

2.2 Matcher类:

常用方法:

  1. matches():表示全字匹配(也就是所有内容进行匹配);String的matchers()用的就是Pattern和Matcher对象来完成的,被String的封装了,使用起来简单,功能较单一;
    如果不需要 全字 匹配,需要改用 lookingAt();
  2. find():将规则作用到字符串上,并进行符合规则的子串查找,匹配指针会下移;
  3. group():用于获取匹配后的结果
  4. start() 与 end() : 获取匹配字符串的下标
    示例:
String str ="wo shi ge da ben dan.";
String reg ="\\b[a-z]{3}\\b";//查找单词为3个字符的\b表示单词边界
Pattern p =Pattern.compile(reg);//规则封装成对象
Matcher m=p.matcher(str);//让正则对象和要作用的字符串相关联,获取匹配器对象
while(m.find()) {
   System.out.print(m.group() +" ");
}
输出为:shi ben dan
String text = "This is the text which is to be searched for occurrences of the word 'is'.";
String patternString = "is";
Pattern pattern = Pattern.compile(patternString);
matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) { 
  count++;  
  System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end());}

输出:

Paste_Image.png

2.3例子Pattern,Matcher:

// 1.正则表达式模式对象
Pattern tPattern = Pattern.compile("[a-z]{3}");
// 2.返回Matcher匹配器对象
Matcher pMatcher = tPattern.matcher("abc");
// 3.是否匹配
System.out.println(pMatcher.matches());

2.4例子认识‘.*?’:

/**认识.*?**/
out("a".matches("."));// '.'匹配所有的单个字符
out("aa".matches("aa"));
out("aaaa".matches("a*"));// '*'表示0或多次
out("aaaa".matches("a+"));// '+'表示一次或多次
out("".matches("a*"));// 'a*'表示'a'出现0或多次
out("".matches("a?"));// 'a?'表示'a'出现0或1次
out("a".matches("a?"));
out("121321312".matches("\\d{3,20}"));
out("192.168.1.172".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1}\\.\\d{1,3}"));
out("259".matches("[0-2][0-5][0-5]"));// []表示在范围中取一个字符
}
public static void out(Object pObj) {
      System.out.println(pObj);
}

2.5例子认识‘[]’表示范围之中:

/**范围[]**/
out("a".matches("[abc]"));
out("a".matches("[^abc]"));// '^'表示取反,不在abc之中
out("A".matches("[a-zA-z]"));// 'a-z'或者'A-Z'范围之中
out("A".matches("[a-z]|[A-Z]"));// '|'表或者,与上类似
out("A".matches("[a-z[A-Z]]"));//与上类似
out("R".matches("[A-Z&&[RFG]]"));//并且在'RFG'之中,取交集

2.5例子认识‘\s, \d, \w, \ ’:

注意: ‘\w ‘表示的范围中不包含’-’符号 也即是字母、数字、下划线三种;

/**认识\s\w\d\**/
out("\n\r\t".matches("\\s{4}"));// '\s'表示空格
out(" ".matches("\\S"));// '\S'表非空格
out("a_4".matches("\\w{3}"));// '\w'表单词字符:[a-zA-Z_0-9]
out("abc123&^%".matches("[a-z]{3}\\d+[&^#%]+"));
out("\\".matches("\\\\"));//匹配'\'

2.6例子边界匹配:

注意: ‘^’在‘[]’中表示取反,而在这里表示的开头的字母

/**边界处理查api**/
out("ncsmsoft company".matches("^n.*"));// '^n'表示以'n'头
out("ncsmsoft company".matches(".*ny$"));// 'y$'表示以'y'尾
// '\b'表示单词边界, 't'是否为单词边界
out("ncsmsoft company".matches("^n[a-z]{1,6}t\\b.*"));
out("ncsmsoftcompany".matches("^n[a-z]{1,20}t\\b.*"));
//空白行,以空格符开头,并且不是换行符,出现0或多次,以换行结尾
out(" \n".matches("^[\\s&&[^\\n]]*\\n$")

2.7例子:Match中的方法matches(),find(),lookingAt()

/**matches,find,lookingAt, start, end**/
Pattern tPattern = Pattern.compile("\\d{3,5}");
String tStr2 ="123-345-55653-33";
Matcher pMatcher = tPattern.matcher(tStr2);
out(pMatcher.matches()); // matches()表示匹配整个字符串
pMatcher.reset();//重置匹配器
out(pMatcher.find());//找子串,匹配的字符串,将被find()吞掉,可以reset()重置
//返回匹配的初始索引和结束之后的索引
out(pMatcher.start() +"-"+ pMatcher.end());//输出0-3
out(pMatcher.find());
out(pMatcher.find());
out(pMatcher.find(12));//重置匹配器,并从指定索引开始的输入序列的下一个子序列
out(pMatcher.lookingAt());//从头找, true
out(pMatcher.lookingAt());// true

2.8例子:Match中的方法替换

/**例子1.replaceAll全部替换**/
Pattern tPattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
String tStr3 ="Java java
JAVA jaVA JaVA I like java you hate Java";
Matcher tMatcher = tPattern.matcher(tStr3);
*out*(tMatcher.replaceAll("JAVA"));
/**例子2.奇偶替换appendReplacement()方法和appendTail()方法**/
Patternt pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
String tStr3 ="Java java
JAVA jaVA JaVA I like java you hate Java ncsmsoft";
Matchert matcher = tPattern.matcher(tStr3);
StringBuffer tStr4 =new StringBuffer();
int tInt = 0;
while (tMatcher.find()) {
if (tInt % 2 == 0) {//偶数
    tMatcher.appendReplacement(tStr4,"java");
}else{//奇数
    tMatcher.appendReplacement(tStr4,"JAVA");
}
tInt++;
}
tMatcher.appendTail(tStr4);//将后面的添加进来
out(tStr4);

2.9例子:认识’()’表示对正则表达式分组. Match中的group分组

为了让规则结果重用,可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想使用已有的组,可用\n的形式来获取,如\1表示引入第一组;
如要获取组值,则用$n,如$1表示拿到第一个组中的值:
叠字替换:

String str ="abbccddeeff";
str.replaceAll("(.)[\\1]+","$1");//第一组出现多个

将ip字符串解析,并按照网段排序:

String ip ="10.10.10.10
2.2.2.2 192.168.2.3 78.23.56.89 10.11.22.33";
ip= ip.replaceAll("(\\d+)","00$1");//使用分组:每一组的连续数字前补2个0
ip= ip.replaceAll("0*(\\d{3})","$1");//只保留3位数的分组了
String[]arr = ip.split(" +");
TreeSettree = new TreeSet();
for(String str : arr)
{
     tree.add(str);
}
for(String str : tree)
{
  System.out.println(str.replaceAll("0*(\\d+)","$1"));//还原IP
}

str将变成: abcdef;

/**'()'分组group**/
Pattern tPattern = Pattern.compile("(\\d{3,5})([a-z]{2})")
String tStr4 ="123bd-3434dc-34333dd-00";
Matcher tMatcher =tPattern.matcher(tStr4);
while(tMatcher.find()){
   out(tMatcher.group());//拿到所有
   out(tMatcher.group(2));//拿到第2组的
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • 原文地址 之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题...
    hmaccelerate阅读 861评论 0 1
  • 早就听说《驴得水》的大名,今天终于逮到机会看一看,标签上写着喜剧、讽刺,确实笑了几次,但更多的是揪心。 故事讲的是...
    驴儿跑阅读 206评论 0 0
  • 曾经以为你会一直默默在身边,但是当你远去竟也有不舍,想留住你却不能那么自私,终究要放开,而心里很感谢我曾在你心里,...
    hy英阅读 104评论 0 0
  • 下雨天要自己打伞 一个人也要记得吃饭 喜欢的东西就去买 不要为别人委屈自己 无聊就吃零食看电视剧看书 学会一个人逛...
    写一封信阅读 150评论 0 2