Java 的正则表达式Regex#
- java.util.regex.Pattern 有正则表达示例
/*
[abc] a, b, or c (simple class) abc中任意一个字符
[^abc] Any character except a, b, or c (negation) 非abc的一个字符
[a-zA-Z] a through z or A through Z, inclusive (range) 匹配a-z A-Z 大小写字符
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union) 匹配a-d 和 匹配 m-p 字符, 匹配则true
[a-z&&[def]] d, e, or f (intersection) 匹配def 与 a-z的并集是 def
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction), 非bc 和 a-z取并集(匹配a d-z字符)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction), 非m-p字符与a-z取并集, 并集是a-l和q-z
*/
private static void Demo7() {
String regex = "[a-z&&[^m-p]]";
System.out.println("a".matches(regex));
System.out.println("n".matches(regex));
}
private static void Demo6() {
String regex = "[a-z&&[^bc]]";
System.out.println("a".matches(regex));
System.out.println("b".matches(regex));
}
private static void Demo5() {
String regex = "[a-z&&[def]]";
System.out.println("m".matches(regex));
System.out.println("a".matches(regex));
System.out.println("d".matches(regex));
}
private static void Demo4() {
String regex = "[a-d[x-z]]";
System.out.println("m".matches(regex));
System.out.println("a".matches(regex));
System.out.println("x".matches(regex));
}
private static void Demo3() {
String regex = "[a-zA-Z]";
System.out.println("a".matches(regex));
System.out.println("*".matches(regex));
}
private static void Demo2() {
String regex = "[^abc]";
System.out.println("a".matches(regex));
System.out.println("d".matches(regex));
System.out.println("10".matches(regex));
}
private static void Demo1() {
String regex = "[abc]";
System.out.println("a".matches(regex));
System.out.println("d".matches(regex));
}
正则预先定义的字符#
public class Demo4_Regex {
public static void main(String[] args) {
/*
. Any character (may or may not match line terminators) 匹配任何字符
\d A digit: [0-9] 0-9字符, 其他字符则false
\D A non-digit: [^0-9] 非 0-9 字符, 0-9字符则false
\h A horizontal whitespace character: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000] 水平空白字符
\H A non-horizontal whitespace character: [^\h] 非水平空白字符
\s A whitespace character: [ \t\n\x0B\f\r] 空白字符
\S A non-whitespace character: [^\s] 非空白字符
\v A vertical whitespace character: [\n\x0B\f\r\x85\u2028\u2029] 垂直空白字符
\V A non-vertical whitespace character: [^\v] 非垂直空白字符
\w A word character: [a-zA-Z_0-9] 大小写 数字 下划线
\W A non-word character: [^\w] 除大小写 数字 下划线 以外字符
*/
}
private static void Demo5() {
// 字符 \w a-zA-Z0-9_ \W, 除去a-zA-Z0-9_的字符
String regex = "\\w";
System.out.println("s".matches(regex));
System.out.println("_".matches(regex));
System.out.println("0".matches(regex));
System.out.println("&".matches(regex));
String regex2 = "\\W";
System.out.println("s".matches(regex2));
System.out.println("_".matches(regex2));
System.out.println("0".matches(regex2));
System.out.println("&".matches(regex2));
}
private static void Demo4() {
String regex = "\\v";
System.out.println(" ".matches(regex));
System.out.println("\t".matches(regex));
System.out.println("\n".matches(regex));
System.out.println("a".matches(regex));
String regex2 = "\\V";
System.out.println(" ".matches(regex2));
System.out.println("\t".matches(regex2));
System.out.println("\n".matches(regex2));
System.out.println("a".matches(regex2));
}
private static void Demo3() {
String regex = "\\s";
System.out.println(" ".matches(regex));
System.out.println("\t".matches(regex));
System.out.println("\n".matches(regex));
System.out.println("a".matches(regex));
String regex2 = "\\S";
System.out.println(" ".matches(regex2));
System.out.println("\t".matches(regex2));
System.out.println("\n".matches(regex2));
System.out.println("a".matches(regex2));
}
private static void Demo2() {
String regex = "\\h";
String regex2 = "\\H";
System.out.println("a".matches(regex));
System.out.println(" ".matches(regex));
System.out.println("\t".matches(regex));
System.out.println("\n".matches(regex));
System.out.println("a".matches(regex2));
System.out.println(" ".matches(regex2));
System.out.println("\t".matches(regex2));
System.out.println("\n".matches(regex2));
}
private static void Demo1() {
String regex = "\\d";
System.out.println("a".matches(regex));
System.out.println("9".matches(regex));
String regex2 = "\\D";
System.out.println("a".matches(regex2));
System.out.println("9".matches(regex2));
}
private static void Demo() {
String regex = ".";
System.out.println("a".matches(regex));
System.out.println("%".matches(regex));
System.out.println("9".matches(regex));
}
}
正则匹配 出现次数#
public class Demo5_Regex {
public static void main(String[] args) {
/*
X? X, once or not at all X出现一次或一次也没有, 但是不能出现其他内容
X* X, zero or more times X出现0次或>0次, 但是不能出现其它内容
X+ X, one or more times X出现1次或>1次, 但是不能出现其它内容
X{n} X, exactly n times X准确出现n次, 不多不少, 但是不能出现其它内容
X{n,} X, at least n times X出现次数至少n次, 但是不能出现其它内容
X{n,m} X, at least n but not more than m times X出现次数 至少n次, 不超过m次, 记[n, m)次
*/
}
private static void Demo6() {
String regex = "[abc]{2,4}";
System.out.println("a".matches(regex));
System.out.println("ab".matches(regex));
System.out.println("aba".matches(regex));
System.out.println("abca".matches(regex));
System.out.println("abcabc".matches(regex));
System.out.println(" ".matches(regex));
}
private static void Demo5() {
String regex = "[abc]{5,}";
System.out.println("abca".matches(regex));
System.out.println("abcab".matches(regex));
System.out.println("abcabc".matches(regex));
System.out.println("dkfjkf".matches(regex));
}
private static void Demo4() {
String regex = "[abc]{5}";
System.out.println("abca".matches(regex));
System.out.println("abccc".matches(regex));
System.out.println("abcabc".matches(regex));
System.out.println("abccd".matches(regex));
System.out.println("d".matches(regex));
System.out.println(" ".matches(regex));
}
private static void Demo3() {
String regex = "[abc]+";
System.out.println("a".matches(regex));
System.out.println("abc".matches(regex));
System.out.println("abcabccc".matches(regex));
System.out.println("abcd".matches(regex));
System.out.println("".matches(regex));
System.out.println("d".matches(regex));
}
private static void Demo2() {
String regex = "[abc]*";
System.out.println("".matches(regex));
System.out.println("a".matches(regex));
System.out.println("b".matches(regex));
System.out.println("bb".matches(regex));
System.out.println("abc".matches(regex));
System.out.println(" ".matches(regex));
System.out.println("s".matches(regex));
}
private static void Demo1() {
String regex = "[abc]?";
System.out.println("".matches(regex));
System.out.println("a".matches(regex));
System.out.println("b".matches(regex));
System.out.println(" ".matches(regex));
System.out.println("bb".matches(regex));
System.out.println("s".matches(regex));
}
}
String 中的 split 方法#
- String[] split(String regex) 匹配正则分隔成字符串数组
// 空格或问号出现1次或以上, 分隔
public class Demo6_Regex {
public static void main(String[] args) {
String str = "What is a youth?";
String regex = "[\\s\\?]+";
String [] strArray = str.split(regex);
for(String s:strArray){
System.out.println(s);
}
}
}
练习 字符串的数组, 经过排序后, 再转换成字符串#
- 字符串, 分隔成字符串组
- 字符串组 转换为 数组
- 数组排序
- 数组重新转换为字符串
public class Demo1_Split {
public static void main(String[] args) {
String str = "1 10 2 30 100 40";
String regex = "[\\s]+";
String [] strArray = str.split(regex);
int [] a = new int[strArray.length];
for(int i=0;i<strArray.length;i++){
a[i] = Integer.parseInt(strArray[i]);
}
StringBuffer sb = new StringBuffer();
Arrays.sort(a);
if(a.length <1){
sb = sb.append("{}");
} else{
sb.append("{");
for (int i=0;i<a.length;i++){
if(i == a.length-1){
sb.append(a[i] + "}");
break;
}
sb.append(a[i] + " ");
}
}
System.out.println(sb);
}
}
正则匹配, 替换字符#
public class Demo2_Replace {
public static void main(String[] args) {
String str = "What2is2a233youth?";
String regex = "[\\d]";
String res = str.replaceAll(regex,"");
System.out.println(res);
String regex2 = "[\\d]";
String res2 = str.replaceAll(regex2," ");
System.out.println(res2);
String regex3 = "[\\d]+";
String res3 = str.replaceAll(regex3," ");
System.out.println(res3);
}
}
正则匹配, 组 捕获#
((A)(B(C))) , 组是以左括号为一组, 所有共有 4 组#
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
正则匹配, 组的练习#
public class Demo4_Replace {
public static void main(String[] args) {
// Demo1();
String str = "我...我...我...我....想想........学编...编...程....程...程程..";
String regex = "[\\.]+";
String str2 = str.replaceAll(regex, "");
System.out.println(str2);
String regex2 = "(.)\\1+";
String str3 = str2.replaceAll(regex2, "$1");
System.out.println(str3);
}
private static void Demo1() {
String str = "abchhhhkdjflllljkklqqqq";
String regex = "(.)\\1+";
String[] strArray = str.split(regex);
for(String s:strArray){
System.out.println(s);
}
}
}
正则匹配, Pattern 和 Matcher, 练习获取手机号#
- 考虑手机号第2位一直在增加, 以1开头11位即认为正确手机号
public static void main(String[] args) {
String str = "我用过的手机号12310001000, 上一个手机号是12310001001, 目前在用的12310001002";
String regex = "[1][\\d]{10}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
Math 类#
public class Demo1_Math {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.abs(-120));
// 向上取整 (0,1]
System.out.println(Math.ceil(23.8));
System.out.println(Math.ceil(23.1));
// 向下取整 [0,1)
System.out.println(Math.floor(23.8));
System.out.println(Math.floor(24.0));
System.out.println(Math.max(23,30));
System.out.println(Math.pow(3,3));
// 包含 [0.0,1.0)
System.out.println(Math.random());
System.out.println(Math.sqrt(2));
}
}
Random 随机数#
- Random 是伪随机数, 生成的随机数由随机因子决定的
- nextInt(100) 可以生成[0,100) 的随机整数
import java.util.Random;
public class Demo1_Random {
public static void main(String[] args) {
Random r = new Random();
for(int i=0;i<10;i++){
int a = r.nextInt(100);
System.out.println(a);
}
Random r2 = new Random(1000);
int a1 = r2.nextInt();
int a2 = r2.nextInt();
System.out.println(a1);
System.out.println(a2);
// 执行多少次 a1 和 a2 固定
}
}
System 类#
- System.in 输入流, Scanner 录收键盘
- System.out 输出控制台
- System.gc() 垃圾回收
- System.currentTimeMillis() 到1971年的毫秒, 2次时间差就能知道程序运行时间
- exit() 退出 0 正常终止, 非0 异常终止
- arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 数组复制, int str 对象等都可复制
public class Demo1_System {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println("jkdjf");
System.out.println(System.currentTimeMillis());
long start = System.currentTimeMillis();
for(int i=0;i<10000000;i++){
System.out.print("");
StringBuffer sf = new StringBuffer();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
for(int i=0;i<10;i++){
new Test();
System.gc();
}
int [] src = {1, 2, 3, 4, 5};
int [] dest = new int[8];
System.arraycopy(src, 0, dest,0,src.length);
for(int i:dest){
System.out.println(i);
}
}
}
class Test{
Test(){}
@Override
public void finalize(){
System.out.println("垃圾回收");
}
}
BigInteger 类#
import java.math.BigInteger;
public class Demo1_BigInteger {
public static void main(String[] args) {
BigInteger bi1 = new BigInteger("100");
BigInteger bi2 = new BigInteger("3");
System.out.println(bi1.add(bi2));
System.out.println(bi1.subtract(bi2));
System.out.println(bi1.multiply(bi2));
System.out.println(bi1.divide(bi2));
BigInteger [] bArray;
bArray = bi1.divideAndRemainder(bi2);
for(BigInteger b:bArray){
System.out.println(b);
}
}
}
BigDecimal, 金融运算使用#
- static BigDecimal valueOf(double val) 由double 转为 BigDecimal
- 构造函数时BigDecimal(String val), string 转为 BigDecimal
public class Demo1_BigDecimal {
public static void main(String[] args) {
System.out.println(2.0 - 1.1 );
BigDecimal bd1 = new BigDecimal(2.0);
BigDecimal bd2 = new BigDecimal(1.1);
System.out.println(bd1.subtract(bd2));
BigDecimal bd3 = new BigDecimal("2.0");
BigDecimal bd4 = new BigDecimal("1.1");
System.out.println(bd3.subtract(bd4));
BigDecimal bd5 = BigDecimal.valueOf(2.0);
BigDecimal bd6 = BigDecimal.valueOf(1.1);
System.out.println(bd5.subtract(bd6));
}
}
Date 类#
- System.currentTimeMillis date.getTime() 都是与GMT 1970 01 01 00:00:00 的毫秒值
public class Demo1_Date {
public static void main(String[] args) {
// Demo1();
Date date = new Date();
System.out.println(date.getTime());
System.out.println(System.currentTimeMillis());
date.setTime(2000);
System.out.println(date);
}
private static void Demo1() {
Date date = new Date();
System.out.println(date);
Date date2 = new Date(0);
System.out.println(date2);
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo1_DateFormat {
public static void main(String[] args) throws ParseException {
// Demo1();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
String strDate = "2021年08月18日 23:44:59 星期三";
Date date = sdf.parse(strDate);
System.out.println(date);
}
private static void Demo1() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
System.out.println(sdf.format(date));
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo2_DateFormat {
public static void main(String[] args) throws ParseException {
String strDate = "1991-01-01";
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = sdf.parse(strDate);
long days = date.getTime() - birthday.getTime();
System.out.println(days/1000/3600/24);
}
}
Calendar 类#
- Calendar 的获取月份时的0对应1月, 7 对应8月
- Calendar 获取的1对应的是 星期天, DAY_OF_WEEK
- add(int field, int amount) 给年月日时分秒增减
- set(int field, int value) 给年月日时分秒设置数值
- set(int year, int month, int date) 设置年月日
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Demo1_Calendar {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
String month = setTwoNu(cal.get(Calendar.MARCH) + 1);
System.out.println(month);
String week = getWeek(cal.get(Calendar.DAY_OF_WEEK));
System.out.println(week);
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
System.out.println(cal.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
System.out.println(sdf.format(cal.getTime()));
}
public static String getWeek(int week){
String [] strArray = {"", "星期日", "星期一","星期二","星期三","星期四","星期五","星期六"};
return strArray[week];
}
public static String setTwoNu(int nu){
String s = String.valueOf(nu);
if( nu <10 ){
s = "0" + nu;
}
return s;
}
}
import java.util.Calendar;
public class Demo2_Calendar {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, 10);
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
calendar.set(Calendar.MONTH, 10);
System.out.println(calendar.get(Calendar.MONTH));
calendar.set(2021,9,01);
System.out.println(calendar.get(Calendar.YEAR) +""+ (calendar.get(Calendar.MONTH)+1) +"" +calendar.get(Calendar.DAY_OF_MONTH));
}
}
Calendar 平年 润年#
import java.util.Calendar;
public class Demo3_Calendar {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int year = 2020;
calendar.set(year,2,1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
if( 29 == calendar.get(Calendar.DAY_OF_MONTH)){
System.out.println( year + "年是润年");
} else {
System.out.println( year + "年是平年");
}
}
}