正则表达式
正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
正则表达式其实就是一种规则。有自己特殊的应用。
1匹配方法
public boolean matches(String regx);
matches是String类中的方法,用于判断该字符串是否匹配regx类型的正则表达式。
该方法用于匹配字符串是否满足QQ号。
private static boolean checkQQNumber2(String qqNum) {
String regx="[1-9][0-9]{4,14}";//表示5-15位数字第一位不能取0
//字符串中匹配正则表达式的方法 matches(regx)
boolean b = qqNum.matches(regx);
return b;
}
1)"[ ]"
"[ ]"用于匹配[]中的任意一个
String s1="a‘’;
boolean b = s1.matches("[abc]");//表示匹配abc中任意一个字符。
String s2="3";
boolean b2 = s2.matches("[123456]");//表示匹配1-6中任意一个字符。
```
# 2)" ^"
"^"如果用于“[ ]”内 则表示否定
```java
String s="3";
boolean b = s2.matches("[^0-9]");//表示匹配除数字外任意字符 flase
3)"."
"."表示匹配任意单个字符
String s1="a";
boolean b = s1.matches(".");//表示匹配任意单个字符。
4)转义字符
如果要匹配".“则需要“\.”
如果要匹配"["与 “]“则需要”\\[“与”\\]”。
“\\d"表示匹配数字与”[0 - 9]"一样。
“\\w"表示匹配数字、字母或下划线。与”[a - zA - Z_0 - 9]"一样
5)"?"
"?"表示匹配出现1次或0次。
String s1 = "";
boolean b = s1.matches("[abc]?");//表示匹配abc中任意一个字符且出现1次或0次。
//空串则表示出现了0次
6)"+"
"+"表示匹配出现1次或多次
String s1 = "aabc";
boolean b = s1.matches("[abc]+");//表示匹配abc中任意一个字符且出现1次或多次
7)"*"
"*"表示匹配出现0次或多次
String s1 = "";
boolean b = s1.matches("[abc]*");//表示匹配abc中任意一个字符且出现0次或多次。
String s2 = "abcabc";
boolean b2 = s2.matches("[abc]*");//表示匹配abc中任意一个字符且出现0次或多次
8)"{ }"
"{d }"表示匹配恰好d次。
"{d, }"表示匹配最少d次。
"{d1,d2}"表示匹配d1到d2次。
String s1 = "aaa";
boolean b1 = s1.matches("[abc]{3}");//表示匹配abc中任意一个字符且恰好出现3次。
String s2 = "abcabc";
boolean b2 = s2.matches("[abc]{3,}");//表示匹配abc中任意一个字符且至少出现3次。
String s3 = "abcabc";
boolean b3 = s3.matches("[abc]{3,6}");//表示匹配abc中任意一个字符且出现3到6次。
2.split()方法
split(String regx)方法表示按照regx正则表达式要求将字符串分割。
例如使用该方法可以将数组字符串转成int型字符串并排序
public class MyDemo {
public static void main(String[] args) {
//把这个字符串转成数组,排序数组,再把排序好的数组转成字符传
String str="91 27 46 38 50";
//截取字符串
String[] split = str.split(" ");
//自己定义一个int类型的数组
int[] arr=new int[split.length];
//遍历字符串数组,把每个元素存到int数组
for (int i = 0; i <split.length ; i++) {
arr[i]=Integer.parseInt(split[i]);
}
//排序数组元素
Arrays.sort(arr);
//遍历int数组,拼串
StringBuilder sb = new StringBuilder();
for(int i=0;i<arr.length;i++){
sb.append(arr[i]).append(" ");
}
System.out.println(sb.toString().trim());
//结果:"27 38 46 50 91"
}
}
3.replaceAll()方法
public String replaceAll (String regex, String replacement)方法可以替换正则表达式。
例如可以将字符串中的数字去掉,则只需匹配到数字再替换成空串。
public class MyDemo {
public static void main(String[] args) {
//String类的功能:public String replaceAll (String regex, String replacement)
String str="abc abdf";
String s = str.replaceAll(" +", "");
System.out.println(s);
String str2="asdfasdfasdf11332111asfdadsfasdf45555544asfadfadsf";
String s1 = str2.replaceAll("[0-9]+", "");
System.out.println(s1);
}
}
4.模式器与匹配器
模式器用来封装正则表达式。
匹配器用来封装要匹配的数据, 能够去匹配 等一系列操作。
public class MyDemo4 {
public static void main(String[] args) {
//用模式器 封装一个正则表达式
Pattern p = Pattern.compile("[a]*[b]");
//通过模式器获取到了一个匹配器
Matcher m = p.matcher("aaaaab");
//调用匹配器中的匹配的方法,去匹配匹配器中的字符串数据
boolean b = m.matches();
System.out.println(b);
// boolean b1 = "aaaaabb".matches("a*b+");
}
}
boolean find()方法用来尝试查找与该模式匹配的输入序列的下一个子序列。
String group () 获取符合正则的字符序列。
注意:一定要先使用find()方法找到才能使用group()方法获取。
public class MyDemo5 {
public static void main(String[] args) {
//需求:获取下面这个字符串中由三个字符组成的单词
String str="da jia ting wo shuo, jin tian yao xia yu, bu shang wan zi xi, gao xing bu?";
String regx="\\b[a-z]{3}\\b";
//获取模式器
Pattern p = Pattern.compile(regx);
//获取匹配器
Matcher m = p.matcher(str);
while (m.find()){
String s = m.group();
System.out.println(s);
}
}
}
6使用分组
在正则表达式中将需要提取的字符串放入()中,在find()方法后使用group(int i )来提取第i个括号中匹配到的字符串。
例如需要提取"a=3,b=431,c=875"这串字符串中的数字。可以将匹配数字的正则放在"()"中
public static void main(String[] args) {
String s = "a=3,b=431,c=875";
Pattern pattern = Pattern.compile("a=(.*),b=(.*),c=(.*)");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
}
7贪婪模式
".*“表示匹配任意个字符串。但是正则表达式会默认使用贪婪模式,即会在”.*"中匹配尽可能多的字符串。
比如下面代码会匹配到abaab而不是a。
public static void main(String[] args) {
String s = "aabaab";
Pattern pattern = Pattern.compile("a(.*)b");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println(matcher.group(1));
}
}
使用".*?"可以取消贪婪模式,每次可以尽可能少的匹配字符串。
下标代码就只会匹配到a。
public static void main(String[] args) {
String s = "aabaab";
Pattern pattern = Pattern.compile("a(.*?)b");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println(matcher.group(1));
}
}