1、下面是java中正则表达式常用的语法:
字符的取值范围
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一个
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是数字
简洁的字符表示
.:匹配任意的字符
d:表示数字
D:表示非数字
s:表示由空字符组成,[ xf]
S:表示由非空字符组成,[^s]
w:表示字母、数字、下划线,[a-zA-Z0-9_]
W:表示不是由字母、数字、下划线组成
数量表达式
1.?: 表示出现0次或1次
2.+: 表示出现1次或多次
3.*: 表示出现0次、1次或多次
4.{n}:表示出现n次
5.{n,m}:表示出现n~m次
6.{n,}:表示出现n次或n次以上
逻辑表达式
1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分
2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
3.(X):子表达式,将X看做是一个整体
2、是否匹配
@Test public void test1() { String str = "1234567abc"; // w:表示字母、数字、下划线,[a-zA-Z0-9_] // {n,}:表示出现n次或n次以上 String regex = "\w{10,}"; System.out.println(str.matches(regex)); } @Test public void test2() { String str = "1234567abc"; String regex = "\w{10,}"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); System.out.println(matcher.matches()); } @Test public void test3() { String content = "I am noob from runoob.com."; String pattern = ".*runoob.*"; boolean isMatch = Pattern.matches(pattern, content); System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch); }
3、统计次数
下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子:
@Test public void test4() { String REGEX = "\bcat\b"; String INPUT = "cat cat cat cattie cat"; Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); // 获取 matcher 对象 int count = 0; while (m.find()) { count++; System.out.println("Match number " + count); System.out.println("start(): " + m.start()); System.out.println("end(): " + m.end()); System.out.println(m.group()); // 匹配的字符串 } }
4、过滤读取
从一串字符串中抓取指定格式的子字符串
/** * Transform StackTrace info to string * @param t * @return */ private static String printStackTraceToString(Throwable t) { if (t == null) { return ""; } StringWriter sw = null; PrintWriter pw = null; try { sw = new StringWriter(); pw = new PrintWriter(sw); t.printStackTrace(pw); pw.flush(); sw.flush(); return sw.getBuffer().toString(); } finally { if (sw != null) { try { sw.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (pw != null) { pw.close(); } } } /** * Get the specified information from StackTrace. * For example, the string of matching the regex["at amberai.jweb(\S*)"] or * ["at com.jsite(\S*)"]. * @param t * @return */ private static String getStackTraceInfo(Throwable t) { String stackTraceInfo = ""; String stackTrace = printStackTraceToString(t); // 匹配的第一种情况 String regex = "at amberai.jweb(\S*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(stackTrace); while (matcher.find()) { stackTraceInfo += matcher.group() + " "; } // 匹配的第二种情况 regex = "at com.jsite(\S*)"; pattern = Pattern.compile(regex); matcher = pattern.matcher(stackTrace); while (matcher.find()) { stackTraceInfo += matcher.group() + " "; } return stackTraceInfo; }
@Test public void demo() { String stackTraceInfo = ""; String stackTrace = "at com.amberai.posmrg:ddagagag at com.amberai.mini:aaaamberai"; String regex = "at(\s*)(\S*)amberai(\S*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(stackTrace); while (matcher.find()) { stackTraceInfo += matcher.group() + " "; } System.out.println(stackTraceInfo); }
5、过滤替换
public static void main(String[] args) { String string = replaceBlank("- a 2 3 4 -"); System.out.println(string); } /* * 去除数据的空格、回车、换行符、制表符 */ public static String replaceBlank(String str) { String dest = ""; if (str != null) { Pattern p = Pattern.compile("\s"); Matcher m = p.matcher(str); dest = m.replaceAll(""); } return dest; }
参考:
2)菜鸟教程:https://www.runoob.com/java/java-regular-expressions.html