正则表达式
正则表达式
正则表达式:正确规则的表达式 规则java给我们定的是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
案例演示
需求:校验qq号码.
1:要求必须是5-15位数字
2:0不能开头
普通方法:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入的你的QQ号");
String qqNumber = sc.nextLine();
//调用校验的方法
boolean flag = checkQQNumber(qqNumber);
if (flag) {
System.out.println("QQ号规则正确");
} else {
System.out.println("QQ号规则错误");
}
}
private static boolean checkQQNumber(String qqNumber) {
boolean flag = false;
if (qqNumber.length() >= 5 && qqNumber.length() <= 15 && !qqNumber.startsWith("0")) {
//判断每一位是数字字符
for (int i = 0; i < qqNumber.length(); i++) {
char ch = qqNumber.charAt(i);
if (!Character.isDigit(ch)) {
flag = false;
break;
} else {
flag = true;
}
}
}
return flag;
}
private static boolean checkQQNumber2(String qqNumber) {
//定义正则表达式
String regx = "[1-9][0-9]{4,14}";
boolean b = qqNumber.matches(regx);
return b;
}
正则表达式的组成规则
规则字符在java.util.regex Pattern类中
A:字符
x 字符 x。举例:‘a’表示字符a
\ 反斜线字符。
\n 新行(换行)符 (’\u000A’)
\r 回车符 (’\u000D’)
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? .
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
\s 匹配空格字符
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi
E:Greedy 数量词
X? X,一次或一次也没有 比如""空串 就是没有
X* X,零次或多次 大于等于1次 都算多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
regx = "[a,b,c]"; //是我列举的某一个
regx = "[a-z]";
regx = "[A,B,C,D]";
regx = "[A-Z]";
regx = "[a-zA-Z]";
regx = "[0,1,2,3]";
regx = "[0-9]";
regx = "[a-zA-Z0-9]";
regx = "[^0-9]"; //^不是列表中的某一个
regx = ".";//配置单个任意字符。
regx = "\\."; // \ 转义字符
regx = "|"; // | 或者
regx = "\\|";
regx = "\\d"; // 跟 [0-9] 这个的意思一样 \D 非数字: [^0 - 9]
regx = "\\w"; // 跟 [a-zA-Z_0-9] 这个意思一样 \W 非单词字符:[^\w]
regx = " ";
regx = "\\s"; //空格 \S 非空白字符:[^\s]
regx = "abc$"; //以abc结尾
regx = "^abc"; // 以abc开头
regx = "[0-9]+"; //0-9 + 可以出现一个或多个
regx = "[a-z]*"; //0-9 * 0个或多个 1个也算多个 空串算0个
regx = "[A-Z]?"; // ? 一个或 0个
regx = "\\w+";
regx = "[a-zA-Z0-9_]+";
regx = "[a-z]{6}"; //正好几个
regx = "[a-zA-Z]{6,}"; //至少6个
regx = "[a-zA-Z]{6,16}"; //大于等于6 小于等于16
正则表达式的判断功能
//matches(phoneRegx); 判断这个字符串,是否符合传入的这个正则表达式。
例如:
//校验手机号的规则
// 手机号 11 位 第一位是 1 第二位 3 5 7 8 其余位随意数字 手机号每一位都是数字。
String phoneRegx="[1][3,5,7,8][0-9]{9}";
//matches(phoneRegx); 判断这个字符串,是否符合传入的这个正则表达式。
boolean b = "13259856542".matches(phoneRegx);
System.out.println(b);
案例演示(校验用户邮箱是否满足要求)
网易邮箱规则:6-18个字符,柯世勇字母、数字、下划线,需要以字母开头@163.com结尾
非正则表达式方法:
public static void main(String[] args) {
/* static boolean isLetterOrDigit ( char ch)
确定指定字符是否为字母或数字*/
// System.out.println(Character.isLetterOrDigit('@'));
/* static boolean isDefined ( char ch)
确定字符是否被定义为 Unicode 中的字符。*/
//System.out.println(Character.isDefined('_'));
Scanner sc = new Scanner(System.in);
System.out.println("请输入的你网易邮箱号");
String email = sc.nextLine();
boolean flag = checkEmail(email);
if (flag) {
System.out.println("邮箱规则正确");
} else {
System.out.println("邮箱规则错误");
}
}
private static boolean checkEmail(String emailName) {
boolean flag = false;
if (emailName.endsWith("@163.com") && emailName.length() >= 14 && emailName.length() <= 26 && Character.isLetter(emailName.charAt(0))) {
String s = emailName.substring(0, emailName.lastIndexOf("@"));
System.out.println(s);
for (int i = 1; i < s.length(); i++) {
char ch = s.charAt(i);
if (!(Character.isLetterOrDigit(ch) || ch == '_')) {
flag = false;
break;
} else {
flag = true;
}
}
}
return flag;
}
正则表达式的写法:
String emailRegx="[a-zA-Z]\\w{5,17}@163\\.com";
正则表达式的分割功能
正则表达式的分割功能 split()方法
String类的功能:public String[] split(String regex)
String names="张三=李四=王五";
//根据正则来切割这个字符串,返回的是一个字符串数组。
String[] strings = names.split("=");
System.out.println(strings[0]);
System.out.println(strings[1]);
System.out.println(strings[2]);
运行结果:
张三
李四
王五
String names2 = "张三assdfa=12542242assadfafasdf2411李四asdfdadsf25244=asdfasdf25411王五"; //
String[] arr = names2.split("[a-z=0-9]+");
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
运行结果:
张三
李四
王五
把给定字符串中的数字排序
A:案例演示: 需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”
-
分析:
-
a: 定义目标字符串"91 27 46 38 50"
-
b: 对这个字符串进行切割,得到的就是一个字符串数组
-
c: 把b中的字符串数组转换成int类型的数组
-
(1): 定义一个int类型的数组,数组的长度就是字符串数组长度
-
(2): 遍历字符串数组,获取每一个元素.将其转换成int类型的数据
-
(3): 把int类型的数据添加到int类型的数组的指定位置
-
d: 排序
-
e: 创建一个StringBuilder对象,用来记录拼接的结果
-
f: 遍历int类型的数组, 将其每一个元素添加到StringBuilder对象中
-
g: 就是把StringBuilder转换成String
-
h: 输出
String str = "91 27 46 38 50 5 300 1 100 3 200"; //"1 3 5 27" 得到一个排好序的字符串 String[] strings = str.split("\\s+"); //你排序的是字符串数组,按照元素的字典顺序来排序的。 //Arrays.sort(strings); //System.out.println(Arrays.toString(strings)); int[] arr = new int[strings.length]; for (int i = 0; i < strings.length; i++) { arr[i] = Integer.parseInt(strings[i]); } //排序int数组 Arrays.sort(arr); StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]).append(" "); } String s = sb.toString().trim(); System.out.println(s); 运行结果: 1 3 5 27 38 46 50 91 100 200 300
正则表达式的替换功能
正则表达式的替换功能
String类的功能:public String replaceAll(String regex,String replacement)
String str="225222asdfa你22222222好";
//替换功能,把非汉字替换成空串根据正则来替换
String s = str.replaceAll("[^\\u4e00-\\u9fa5]", "");
System.out.println(s);
Pattern和Matcher的概述
//匹配器Matche 模式器Pattern
//把一个正则表达式封装到模式器里面
Pattern p = Pattern.compile("a*b");
//调用模式器中的matcher("aaaaab");方法,传入一个待匹配的数据,返回一个匹配器
Matcher m = p.matcher("aaaaab");
//调用匹配器中的匹配的方法,看数据是否匹配正则
boolean b = m.matches();
System.out.println(b);
//如果你的需求只是看一个数据符不符合一个正则,你只需要调用,String类中的matches("a*b")
System.out.println("aaaaab".matches("a*b"));
//之所以Java给我提供了 匹配器Matche 模式器Pattern 这两个类,是因为,这两个类中有更丰富的方法供我们使用
正则表达式的获取功能
正则表达式的获取功能 Pattern和Matcher的结合使用
案例演示 使用的是 find()方法 和 group()方法 注意一定要先使用find()方法先找到 才能用group()方法获取出来
需求:获取下面这个字符串中由三个字符组成的单词 正则表达式 \\b[a-z]{3}\\b
da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
String str="da jia ting wo shuo, jin tian yao xia yu, bu shang wan zi xi, gao xing bu?";
/* boolean find ()
尝试查找与该模式匹配的输入序列的下一个子序列。
String group ()
返回由以前匹配操作所匹配的输入子序列。*/
String regx="\\b[a-z]{3}\\b";
Pattern pattern = Pattern.compile(regx);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String s = matcher.group();
System.out.println(s);