Java 正则表达式:
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
正则表达式实例:
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 “Hello World” 字符串。
.(点号)也是一个正则表达式,它匹配任何一个字符如:“a” 或 “1”
matches() 方法用于检测字符串是否匹配给定的正则表达式。
调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:
Pattern.matches(regex, str)
参数:
regex – 匹配字符串的正则表达式
package heima;
public class Demo {
/*
* 检验qq号
* 开头不能为0
* 必须都是数字
* 5-15位
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String regex = "[1-9]\\d{4,14}";
System.out.println("2544946".matches(regex));
System.out.println("2544946a".matches(regex));
System.out.println("02544946".matches(regex));
}
}
正则表达式语法
在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \d,而表示一个普通的反斜杠是 \\。
package heima;
public class Demo {
/*
* 任意字符
* \d 数字:[0-9]
* \D 非数字:[^0-9] 除0-9
* \s 空白字符:[\t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\W]
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String regex = "\\d";
System.out.println("0".matches(regex)); //true
System.out.println("a".matches(regex)); //false
System.out.println("9".matches(regex)); //true
}
}
package heima;
public class Demo1 {
/*
* Greedy 数量词
* X? X,一次或者一次也没有
* X* X,零次或多次(一次也可以)
* X+ X ,一次或者多次
* X{n} X,恰好n次
* X{n,} X,至少n次
* X{n,m} X,至少n次,但是不超过m次
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String regex = "[abc]?"; //一次或者一次也没有
System.out.println("a".matches(regex)); //true
System.out.println("b".matches(regex)); //true
System.out.println("c".matches(regex)); //true
System.out.println("d".matches(regex)); //false 问的是[]里面的
}
}
package heima;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "金三胖 郭美玲 李daa";
String[] arr = s.split(" "); //用空格切
//String[] arr = s.split("//."); // .代表任意字符不能用.切得用//.切
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
结果:
金三胖
郭美玲
李daa
package heima;
import java.util.Arrays;
public class Demo3 {
/*
* 案例演示:
* 需求:我有一个字符串:“91 27 46 38 50”请写代码实现最终输出结果是:“27 38 46 50 91 ”
* 分析:
* 1,将字符串切割成字符数组
* 2,将字符串转换成数字并将其存储在一个等长的int数组中
* 3,排序
* 4,将排序后的结果遍历并将拼接成一个字符串
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//1,将字符串切割成字符数组
String s = "91 27 6 38 50";
String[] sArr= s.split(" ");
//2,将字符串转换成数字并将其存储在一个等长的int数组中
int[] arr = new int[sArr.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(sArr[i]); //将字符串转换为数组
}
//3,排序
Arrays.sort(arr);
// 4,将排序后的结果遍历并将拼接成一个字符串
// 用String 会产生很多垃圾
// String str = "";
// for (int i = 0; i < arr.length; i++){
// if(i == arr.length-1) {
// str = str + arr[i];
// }else {
// str = str + arr[i] + " ";
// }
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1) {
sb.append(arr[i]);
}else {
sb.append(arr[i] + " ");
}
}
System.out.println(sb);
}
}
package heima;
public class Demo4 {
/*
* A:替换功能
* String类的功能:public String replaceAll(String regex,String replacement)
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "wolai2heima";
String regex = "\\d"; // \\d表示的是任意字符
String s2 = s.replaceAll(regex, ""); //""传一个空串就可以了
System.out.println(s2);
}
}
package heima;
public class Demo5 {
/*
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 (A
3 (B(C))
4 (C)
组零始终代表整个表达式。
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//叠词 快快乐乐 高高兴兴
// demo();
// demo1();
String s = "我..我...我.要要..要要学..学学..学..学..编编.编程..程....程";
String s2 = s.replaceAll("\\.+", "");
String s3 = s2.replaceAll("(.)\\1+", "$1"); //$1代表第一组中的内容 (.)\\1+代表一个或者多个我
System.out.println(s3); // $1:把多个我替换成一个
}
private static void demo1() {
String s = "adqqfgkkjhpppkd";
String regex = "(.)\\1+"; //+代表第一组出现一次到多次
String[] arr = s.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void demo() {
String regex = "(.)\\1(.)\\2"; // \\1代表第一组又出现一次 \\2代表第二组又出现一次
System.out.println("快快乐乐".matches(regex));
}
}
package heima;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "我的手机号码是18912345678,还用过18987456123,和1897654321";
String regex = "1[3578]\\d[9]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find())
System.out.println(m.group());
}
}
jar中有
// Math的构造方法是私有的
Math.max(15,18);// 返回两者中的较大的
Math.min(15,18);// 返回两者中的较小的
Math.random();// 随机返回一个(0.0到1.0中间的double类型的小数)
构造方法摘要
Random()
创建一个新的随机数生成器。
Random(long seed)
使用单个 long 种子创建一个新的随机数生成器。
1、Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
a、public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
b、public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
示例代码:
Random r = new Random();
Random r1 = new Random(10);
再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。
验证:相同种子数的Random对象,相同次数生成的随机数字是完全相同的。
gc() 运行垃圾回收器。
exit(int status) 终止当前正在运行的 Java 虚拟机。
arraycopy( src, 0, dest, 0, int length) //将数组内容拷贝 src要拷贝的数组 dest要拷贝到哪去 length 要拷贝出多少个数组出来
可以让超过Integer范围内的数据进行运算
构造方法:
public BigInteger(String val)
由于在运算的时候float类型和double很容易丢失精度
所以为了能精确的表示 计算浮点数 java提供了BigDecimal
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal bd1 = new BigDecimal("2.0");
BigDecimal bd2 = new BigDecimal("1.1"); //通过构造中传入字符串的方式,开发时推荐
System.out.println(bd1.subtract(bd2)); //结果:0.9
BigDecimal bd3 = BigDecimal.valueOf(2.0);
BigDecimal bd4 = BigDecimal.valueOf(1.1); //开发中也推挤
System.out.println(bd3.subtract(bd4));
}
表示特定的瞬间,精确到毫秒。
public static void main(String[] args) {
// TODO Auto-generated method stub
Date d1 = new Date(); //如果没有传参数代表当前时间
System.out.println(d1);
Date d2 = new Date(0);
System.out.println(d2); //如果构造方法中参数传为0代表1970年1月1日
Date d3 = new Date();
System.out.println(d3.getTime());
}
package heima;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo9 {
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
demo1();
//将日期字符串转换为日期对象
String str = "2000年08月08日 08:08:08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //创建日期格式类对象
Date d= sdf.parse(str);
}
private static void demo1() {
//DateFormat df = new DateFormat(); //DateFormat抽象类不能被实例化
Date d= new Date(); //获取当前时间对象
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //创建日期格式类对象
System.out.println(df.format(d));
}
}
package heima;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo10 {
/*
* 你来到这个世界多少天
* 分析
* 1,将生日字符串和今天字符串存在String类型的变量中
* 2.定义日期格式化对象
* 3.将日期字符串转换成日期对象
* 4.通过日期对象后期时间毫秒值
* 5.将两个时间毫秒值相减除以1000,在除以60,再除以60,再除以24得到天
*
*/
public static void main(String[] args) throws ParseException {
//1,将生日字符串和今天字符串存在String类型的变量中
String birthday = "1998年1月2日";
String today = "2019年6月28日";
//2.定义日期格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//3.将日期字符串转换成日期对象
Date d1 = sdf.parse(birthday);
Date d2 = sdf.parse(today);
//4.通过日期对象后期时间毫秒值
long time = d2.getTime() - d1.getTime();
//5.将两个时间毫秒值相减除以1000,在除以60,再除以60,再除以24得到天
System.out.println(time / 1000 / 60 / 60 /24);
}
}
获取日期的方法
package heima;
import java.util.Calendar;
public class Demo_Calender {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR)); //通过字段获取年
System.out.println(c.get(Calendar.MONTH)); //通过字段获取月,当是月是从0开始编号
System.out.println(c.get(Calendar.DAY_OF_MONTH)); //月中的第几天
System.out.println(c.get(Calendar.DAY_OF_WEEK));
System.out.println((c.get(Calendar.YEAR))+"年" + (c.get(Calendar.MONTH))+1
+ "月" + (c.get(Calendar.DAY_OF_MONTH)) + "日" + getWeek(c.get(Calendar.DAY_OF_WEEK)));
}
public static String getWeek(int week) {
String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[week];
}
}