package com.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Test { public static void main(String[] args) {
//正则表达式
//一个 "." 代表一个任意字符 p("abc".matches("..."));
//"\d"代表一个数字, \D相当于不是数字, 对\d取反
p("as897as98fsg6dfg9sddf".replaceAll("\\d", "_"));
//Pattern可以编译正则表达式的一个模式
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("erf");
p(m.matches());//matches()方法永远是匹配整个字符串
//以上三行代码相当于下面这一句, 但是上面三句性能比较高
//{n}, 一定出现n次
//{n,}, 至少出现n次, 最多不限
//{n,m}, 至少出现n次, 不超过m次
p("qqq".matches("[a-z]{3}")); //初步认识".", "*", "+", "?" MataData(源数据)
p("a".matches("."));//一个任意字符
p("aa".matches("aa"));
p("aaaa".matches("a*"));//0个或多个
p("aaaa".matches("a+"));//1个或多个
p("aaaa".matches("a?"));//1个或不存在
p("".matches("a?"));//零宽度匹配
p("a".matches("a?"));
p("45913549872168435".matches("\\d{3,10}"));
p("192.168.0.222".matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}"));
p("192".matches("[0-2][0-9][0-9]")); //范围
p("a".matches("[abc]"));//[]指的是匹配一个字符, 不管写多长
p("l".matches("[^abc]"));//"^"除了abc其他都可以匹配
p("a".matches("[a-zA-Z]"));//"-"代表的是从哪个范围到哪个范围(这个的意思是小写字母或者是大写字母)
p("a".matches("[a-z]|[A-Z]"));//同上
p("a".matches("[a-z[A-Z]]"));//同上
p("R".matches("[A-Z&&[RFG]]"));//同事满足两个范围 //认识\d \s \\u \
p(" \n\t\r".matches("\\s{4}"));//"\s"是空白字符, 比如空格, 换行符, 制表符等
p("发".matches("\\S{1,8}"));//"\S"是对"\s"的取反
p("a_8".matches("\\w{3}"));//"\w"指的可以用作命名的字符:大小写字母下划线+数字
p("abc807$%".matches("[a-z]{1,3}\\d+[&^%$]+"));
p("\\".matches("\\\\")); //边界匹配器
p("hello sir".matches("^h.*"));//"^"在"[]"外面的时候代表的是一行的开始
p("hello sir".matches(".*ir$"));//"$"放在最后代表的是一行的结束
p("hello#sir".matches("^h[a-z]{3}o\\b.*"));//"\b"单词边界可以包括那些空白字符或者"\W"等
p("hellosir".matches("^h[a-z]{3}o\\b.*")); //过滤空白行("*"是用来修饰"^[\\s&&[^\\n]")
p(" \t \n".matches("^[\\s&&[^\\n]]*\\n$")); //Email地址
p("sdtght-@ryhrtbrebgr.com".matches("[\\w[.-]]+@[\\w[.-]]+.[\\w]+")); //matches.find()方法是查找字符串中符合正则表达式的子字符串
//正则表达式的搜索引擎需要注意的一点
Pattern p1 = Pattern.compile("\\d{3,5}");
String s = "123-4567-8912-12345-ac";
p("字符串的总长度: "+s.length());
Matcher m1 = p1.matcher(s);
p(m1.matches());
//当执行完上面一行代码, 正则表达式引擎已经将String s匹配完了, 后面的几个find()方法是从"4567..."开始找的
//也就是说find()方法和matches()是相互影响的
m1.reset();//调用reset()方法可以解决find和matches相互影响
p(m1.find());
p(m1.start()+"----------"+m1.end());
p(m1.find());
p(m1.start()+"----------"+m1.end());
p(m1.find());
p(m1.start()+"----------"+m1.end());
p(m1.find());
p(m1.start()+"----------"+m1.end());
p(m1.find());
//如果想要输出找到的子字符串的位置, 前提是必须要能找到, 否则再执行下面这行代码就会报错 !
p(m1.start()+"----------"+m1.end()); //lookingAt()方法是从整个字符串的开始位置去查找
p(m1.lookingAt());
p(m1.lookingAt());
p(m1.lookingAt());
p(m1.lookingAt()); //简单做个练习, 找出所有的网址
String news = "民生在勤,勤则不匮www.baidu.com——习大大曾用2000多年前《左传》中的古语阐www.sina.com.cn释最朴实的道理。"
+ "2013spring.io年4月28日,"
+ "习大大在全国总工会机关同全国www.qq.com劳动模范代表座谈时强调,"
+ "必须牢固树立www.hanqi.net劳动最光荣、劳动最崇高、劳动最伟大、劳动最美丽的观念,崇尚劳动,造福劳动者,"
+ "让全体人民进一步焕发劳动热情、释放创造news.ifeng.com潜能,通过劳动创造更加美好的生活。"; System.out.println(news); Pattern p2 = Pattern.compile("[[a-z][.]]+[\\w]+");
Matcher m2 = p2.matcher(news);
while(m2.find()) {
//p(news.substring(m2.start(), m2.end()));
p(m2.group());
} //字符串的替换
//Pattern.CASE_INSENSITIVE(Pattern里面的一个常量, 忽略大小写)
Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
String s1 = "java Java jaVA JAVA jaVa i like jAva qwert";
Matcher m3 = p3.matcher(s1);
int b=0;
StringBuffer buf = new StringBuffer();
while(m3.find()) {
//replaceAll直接返回已经替换的整个字符串
//p(m.replaceAll("java"));
b++;
//如果要把偶数位的java替换成小写, 奇数位的替换成大写
if(b%2==0) {
m3.appendReplacement(buf, "java");
} else {
m3.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf);
p(buf.toString()); //正则表达式的分组
//应用: 在下面的例子中, 如果想取出每一个匹配的字符串之后, 还想取出只是数字的字符串
// 可以使用分组, 分组规则, 从左往右数第几个"(", 就是第几个分组
Pattern p4 = Pattern.compile("((\\d{3,5})([a-z]{2}))");
String s2 = "123av-4567aa-8912qq-12345vv-ac";
Matcher m4 = p4.matcher(s2);
while(m4.find()) {
p(m4.group(3));
}
} public static void p(Object o) {
System.out.println(o);
}
}

统计一个页面上有多少Email地址

package com.regexp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class EmailSpider { public static void main(String[] args) {
File f = new File("E:\\workspace\\regexp\\htmlfiles\\1.html");
String line = "";
if(f.exists()) {
try {
FileReader fr = new FileReader(f.getPath());
BufferedReader br = new BufferedReader(fr);
Pattern p = Pattern.compile("[[\\w][-]]+@[[\\w][-.]]+\\.[\\w]+");
while((line = br.readLine())!=null) {
Matcher m = p.matcher(line);
if(m.find()) {
System.out.println(m.group());
}
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
}

统计代码行数

package com.regexp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; public class CodeCounter { static long normalLines = 0;//代码行
static long commentsLines = 0;//注释行
static long whiteLines = 0;//空行 public static void main(String[] args) {
File f = new File("E:\\workspace\\CustomManager\\src\\com\\dao\\impl");
File[] codeFiles = f.listFiles();
for(File child : codeFiles) {
if(child.getName().matches(".*\\.java$")) {
parse(child);
}
}
System.out.println("代码行数: "+normalLines);
System.out.println("注释行数: "+commentsLines);
System.out.println("空行数: "+whiteLines);
} private static void parse(File f) {
BufferedReader br = null;
boolean comment = false;
try {
br = new BufferedReader(new FileReader(f));
String line = "";
while((line=br.readLine())!=null) {
line = line.trim();
if(line.matches("^[\\s&&[^\\n]]*")) {
whiteLines++;
} else if((line.startsWith("/*")&&line.endsWith("*/"))||line.startsWith("//")) {
commentsLines++;
} else if(line.startsWith("/*")) {
comment = true;
commentsLines++;
} else if(true == comment) {
commentsLines++;
if(line.endsWith("*/")) {
comment = false;
}
} else {
normalLines++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
br = null;
}
}
}
}

java使用正则表达式的更多相关文章

  1. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  2. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  3. Java的正则表达式

    package RegexTest; /** * Created by hu on 2016/3/29. */ /* * Java的正则表达式 在正则表达式中,用\d表示一位数字,如果在其它语言中使用 ...

  4. Java与正则表达式

    Java与正则表达式 标签: Java基础 正则 正如正则的名字所显示的是描述了一个规则, 通过这个规则去匹配字符串. 学习正则就是学习正则表达式的语法规则 正则语法 普通字符 字母, 数字, 汉字, ...

  5. Java中正则表达式去除html标签

    Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...

  6. Java面向对象 正则表达式

     Java面向对象 正则表达式 知识概要:                (1)正则表达式的特点 (2)正则表达的匹配 (3)正则表达式的切割,替换,获取 (4)正则表达式的练习 正则表达式:符合 ...

  7. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码正则表达式

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年11 ...

  8. JAVA中正则表达式常用的四个方法

    JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...

  9. Java对正则表达式的支持(一)

    Java对正则表达式的支持主要体现在String.Pattern.Matcher和Scanner类. 1.Pattern.Matcher 先看一个Pattern和Matcher类使用正则表达式的例子. ...

  10. Java中用正则表达式判断日期格式是否正确

    1.Java中用正则表达式判断日期格式是否正确 DateType.java: /** * @Title:DateType.java * @Package:com.you.dao * @Descript ...

随机推荐

  1. python中的get

    get()根据键获取字典中的值,如果键不存在则返回一个默认值,默认值不填写则返回None 1 a = { 2 "name":"dlrb", 3 "ag ...

  2. 【ASP.NET 进阶】Flv视频文件在线播放示例

    最近要做个播放Flv文件的东东,网上找到一个合适的,效果如下(GIF录制软件不太好,差不多就是这样子,不过在浏览器上很流畅,具体代码可以看源代码): 源代码:FlvVideoSee.zip 问题说明: ...

  3. leetcode153

    class Solution: def findMin(self, nums: 'List[int]') -> int: l = 0 h = len(nums)-1 while l < h ...

  4. container_of使用小结

    先上演示代码 #include <stdio.h> #include <stdlib.h> /* offsetof example */ #include <stddef ...

  5. QT,QT SDK, QT Creator 区别

    Qt是一个跨平台的C++图形用户界面应用程序框架.(不仅仅是C++,还包括QML,Qquick,html5)它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩 ...

  6. YUV420格式解析<转>

    在YUV420中,一个像素点对应一个Y,一个2X2的小方块对应一个U和V.对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像. YUV420sp与YUV420p的数据格 ...

  7. Scrapy框架--代理和cookie

    如何发起post请求? 代理和cookie: cookie:豆瓣网个人登录,获取该用户个人主页这个二级页面的页面数据. 如何发起post请求? 一定要对start_requests方法进行重写. 1. ...

  8. MyEclipse反向生成Java代码 ,Reverse Engineering-->Java Source Folder-->没有提供任何条目

    在web项目名称上,手动执行一遍Add Hibernate Capabilities,然后再去DB Browser中进行反向生成pojo实体类和hbm.xml映射文件!,具体生成反向代码的配置如下图所 ...

  9. 【383】defaultdict 相关用法

    可以定义一个字典,可以添加默认值,int 为 0,list 为 [],set 为 {} int:默认值为 0 from collections import defaultdict int_dict ...

  10. ImportError: No module named etree.ElementTree问题解决方法

    学习python操作xml文档过程中碰到的ImportError: No module named etree.ElementTree问题,问题现象比较奇怪,做个记录. 操作环境 Python3.6+ ...