正则表达式
来源:互联网 发布:mac过滤设置怎么解除 编辑:程序博客网 时间:2024/04/29 05:28
package cn.jobs1127.regExp;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.lang.StringUtils;/** * 正则表达式简单认识 测试 * * @author jobs1127 "."表示一个字符、*代表0个或多个、+代表一个或多个、?代表0个或1个 * []表一个区间范围的一个字符、{}表示个数,多少位,多少个,{2,3}表示最少2个,最多3个 在[]里^是取反 \d 数字:[0-9] * \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w * 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] */public class RegExp { public static void p(Object o) { System.out.println(o); } public static void main(String[] args) { // 一个点代表一个字符 p("abc".matches("...")); // true // \\d代表数字 p("a8729ac99aa000kkk".replaceAll("\\d", "*")); p("a8729ac99aa000kkk".replaceAll("[a-z]", "*")); p("a8729ac99aa000kkkAA".replaceAll("[a-z]", "*")); // Pattern 是一个模式 编译一个正则表达式 [a-z]表示a到z任意一个字符 [a-z]{8}表示是a-z范围字符,刚好8个字符 Pattern p1 = Pattern.compile("[a-z]{8}"); // 通过这个模式去匹配一个字符串 Matcher m1 = p1.matcher("jobs1127"); p(m1.matches());// false // 以上三句话等同以下一句话,只是上面的三句话效率更高 p("jobs1127".matches("[a-z]{8}"));// false p("jobsaaaa".matches("[a-z]{8}"));// true p("fgh".matches("[a-z]{3}"));// true p("fgh".matches("[a-z]{4}"));// false System.out.println("------------1-----------"); // . * + ? p("a".matches("."));// true p("a".matches(".."));// false p("aa".matches("aa"));// true p("aaaa".matches("a*"));// true 0或N个a p("aaaa".matches("a+"));// true 1个或N个a p("".matches("a*"));// true 0或N个a p("aaaa".matches("a?"));// false 0或1个a System.out.println("------------1.1-----------"); p("".matches("a?"));// true 0或1个a p("a".matches("a?"));// true 0或1个a p("214444".matches("\\d{3,100}"));// true 至少3个,最多100个数字 p("214444a".matches("\\d{3,100}"));// false 至少3个,最多100个数字 // \\d{1,3}1到3位的数字 p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));// false // []表示一个范围[0-2]表示0到2的一个数字 p("192".matches("[0-2][0-9][0-9]"));// true System.out.println("------------1.2-----------"); p("a".matches("[abc]")); // true p("a".matches("[^abc]"));// false p("A".matches("[a-zA-Z]"));// true p("A".matches("[a-z]|[A-Z]"));// true p("A".matches("[a-z[A-Z]]"));// true p("R".matches("[A-Z&&[RFG]]"));// true A-Z并且在[RFG]中的某1一个 System.out.println("------------1.3-----------"); // \s \w \d \ p(" \n\r\t".matches("\\s{4}"));// true p(" ".matches("\\S"));// false p("a_6".matches("\\w{3}"));// true p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));// true p("\\".matches("\\\\"));// true System.out.println("------------1.4-----------"); // POSIX Style p("a".matches("\\p{Lower}"));// true System.out.println("------------1.5-----------"); // boundary 边界匹配 p("hello sir".matches("^h*"));// false p("hhello sir".matches("^h*"));// false p("hello sir".matches("^h.*"));// true 以h开头 p("hello sir".matches(".*ir$"));// true //以ir结束 p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));// true \\b单词边界 p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));// false o旁边是边界 System.out.println("------------1.6-----------"); // whilte lines 空白行 的正则表达式 p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));// true System.out.println("------------1.7-----------"); 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 System.out.println("------------1.8-----------"); // 匹配email 的正则表达式 p("asdfasdfsafsf@dsdfsdf.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));// true System.out.println("------------1.9-----------"); // matches匹配所有 find找子字符串 lookingAt从头开始找 Pattern p = Pattern.compile("\\d{3,5}"); String s = "123-34345-234-00"; Matcher m = p.matcher(s); p(m.matches());// false m在匹配到第四个字符是发现 已经不匹配了 m.reset(); // 如果没有reset m.find()是从第四个开始找 p(m.find());// true 可以找到 p(m.start() + "-" + m.end());// find 123- p(m.find());// true 可以找到 p(m.start() + "-" + m.end());// find 34345- p(m.find());// true 可以找到234- p(m.start() + "-" + m.end()); p(m.find());// false 00 不够3个,所有find false // p(m.start() + "-" + m.end());//报错,没有找到,但又打印,边界越界 System.out.println("------------2.0-----------"); p(m.lookingAt()); p(m.lookingAt()); p(m.lookingAt()); p(m.lookingAt()); System.out.println("------------2.1-----------"); // replacement Pattern p2 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);// 启用不区分大小写的匹配 Matcher m2 = p2.matcher("java Java JAVa JaVa IloveJAVA you hateJavaafasdfasdf"); StringBuffer buf = new StringBuffer(); int i = 0; while (m2.find()) {// 找到符合要求的子串 后面不符合要求就不找了 // p(m2.group());//把找到的分组显示 // String str = m2.replaceAll("JAVA"); // System.out.println(str); i++; if (i % 2 == 0) {// 偶数转换成小写 以追加的替换方式来替换并填充到buf里 m2.appendReplacement(buf, "java"); } else {// 奇数转换成大写 m2.appendReplacement(buf, "JAVA"); } } m2.appendTail(buf); p(buf); System.out.println("------------2.2-----------"); // group 根据()来分组 (\\d{3,5})为第一组、([a-z]{2})为第二组, Pattern p3 = Pattern.compile("(\\d{3,5})([a-z]{2})"); String s3 = "123aa-34345bb-234cc-00"; Matcher m3 = p3.matcher(s3); while (m3.find()) { p(m3.group(1));// 分组显示 第一组 } m3.reset(); while (m3.find()) { p(m3.group(2));// 分组显示 第二组 } m3.reset(); while (m3.find()) { p(m3.group());// 分组显示全部 } System.out.println("------------抓取email----------------------"); getEmails(); System.out.println("------------计算某个文件目录下所有java文件的空行、注释行、有效代码------------"); CodeCounter(); //System.out.println(StringUtils.trim(" /** a").startsWith("/*")); //System.out.println("/**".startsWith("/*")); System.out.println("------------2.3-----------"); // qulifiers Pattern p4 = Pattern.compile("(.{3,10}?)[0-9]"); String s4 = "aaaa5bb"; Matcher m4 = p4.matcher(s4); if(m4.find()) { p(m4.start() + "-" + m4.end()); } else { p("not match!"); } System.out.println("------------2.4-----------"); // non-capturing groups (?=a)不表示分组,表示3个字符后以a结束 Pattern p5 = Pattern.compile(".{3}(?=a)"); String s5 = "444a66b"; Matcher m5 = p5.matcher(s5); while(m5.find()) { p(m5.group()); } } /** * 计算某个文件目录下所有java文件的空行、注释行、有效代码 */ static Map<String, Long> counts = new HashMap<String, Long>(); public static void CodeCounter() { String src = "D:\\myeclipse_workspace\\myLearing\\src"; //String src = "D:\\DateTools.java"; File file = new File(src); parseFile(file); for (String key : counts.keySet()) { System.out.println(key + ":" + counts.get(key)); } } private static void parseFile(File f) { if (f.canRead()) { if (f.isDirectory()) { File[] files = f.listFiles(); for (File ff : files) { parseFile(ff); } } else { if (f.getName().matches(".*\\.java$")) { // System.out.println(f.getName()); parse(f); } } } } /** * 读取某个文件里的email */ public static void getEmails() { try { BufferedReader bf = new BufferedReader(new FileReader("D:\\email.txt")); String ss = ""; while ((ss = bf.readLine()) != null) { // System.out.println(ss); p(parse(ss)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 解析字符串 * * @param line * @return */ public static String parse(String line) { StringBuilder sb = new StringBuilder(); String regex = "[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"; Pattern pe = Pattern.compile(regex); Matcher me = pe.matcher(line); while (me.find()) {// 不停的去寻找,只要没有me.reset(),就会继续寻找 sb.append(me.group() + "\n"); } return sb.toString(); } public static Map<String, Long> parse(File f) { long normalLines = 0;// 正常行 long commentLines = 0;// 注释行 long whiteLines = 0;// 空白行 try { BufferedReader bf = new BufferedReader(new FileReader(f)); String line = ""; int i = 0; boolean isEnd = false; while ((line = bf.readLine()) != null) { i++; if (line.matches("^[\\s&&[^\\n]]*$")) { whiteLines++; } else if (StringUtils.trim(line).startsWith("//")) { commentLines++; } else if (StringUtils.trim(line).contains("/*")) { commentLines++; isEnd = true; } else if (isEnd) { commentLines++; if (line.contains("*/")) { isEnd = false; } } else { normalLines++; } } System.out.println(f.getName() + "文件共:" + i + "行"); if (counts.containsKey("normalLines")) { counts.put("normalLines", counts.get("normalLines") + normalLines); } else { counts.put("normalLines", normalLines); } if (counts.containsKey("commentLines")) { counts.put("commentLines", counts.get("commentLines") + commentLines); } else { counts.put("commentLines", commentLines); } if (counts.containsKey("whiteLines")) { counts.put("whiteLines", counts.get("whiteLines") + whiteLines); } else { counts.put("whiteLines", whiteLines); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return counts; }}
0 0
- 【正则表达式】正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- JAVA知识2016-12-23
- 汉字库
- 最小二乘法
- jenkins 部署 git 项目
- 汇编语言实现通讯录
- 正则表达式
- OSTaskCreate()
- Ubuntu侧边栏添加AndroidStudio快捷方式
- Flask 学习笔记之入门
- MySQL开启root远程访问权限的方法
- java-异常
- 算法设计与分析题目练习二:八皇后问题(经典回溯算法)
- keil配置
- 【转】压力测试工具siege的用法