正则表达式
一. 正则表达式
regex :用于处理字符串,如字符串的匹配,字符串的查找,字符穿的替换.
Regex涉及的类
java.lang.String
Java.util.regex.Pattern
java.util.regex.Matcher
注意: \在java中表示转译字符 所以java正则表达式中需要使用两个\表示一个\.
二. 正则表达式基本使用方法
第一种方法
“abc”.matches(“...”); 使用方便但是每次都需要编译在多次使用中速度相比第二种会慢些
第二种方法
Pattern p = Pattern.compile(“...”); 将给定的正则表达式编译到模式中
Matcher m = p.matcher(“[z-a]{3}); 编译给定正则表达式并尝试将给定输入与其匹配
m.matches(); 输出结果
三. 正则表达式常用符号
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex {
public static void main(String[] args) {
//.:任何字符 *: 零次或多次 +:一次或多次 ?: 一次或一次没有
p("aaaa".matches("a")); //false
p("aaaa".matches("a*")); //true
p("aaaa".matches("a+")); //true
p("a".matches("a?")); //true
p("".matches("a*")); //true
p("".matches("a?")); //true
p("aaaa".matches("aaaa")); //true
p("3215345466".matches("\\d{3,100}")); //true
p("192".matches("[1-2][0-9][0-9]")); //true
//\d : 数字[0-9] \s 空白字符 \w单词字符 [a-zA-Z_0-9] \D: [^\d] /W: [^\w] \s: [^\s]
p(" \t\r\n".matches("\\s{4}")); //true
p("a_w".matches("\\w{3}")); //true
p("asd454534&^%$".matches("\\w{1,3}\\d+[%^&$]+")); //true
p(" ".matches("\\S")); //false
p("\\".matches("\\\\")); //true 一个\用连个\\代替
p("asd".matches("\\D+")); //true
//[]范围(一个[]值匹配一个字符) [^a] 除了a
p("a".matches("[abc]")); //true
p("a".matches("[a-z]")); //true
p("a".matches("[a-zA-Z]")); //true
p("a".matches("[a-z]|[A-Z]")); //true
p("a".matches("[a-z[A-Z]]")); //true 并集
p("a".matches("[^abc]")); //false
p("a".matches("[A-Z&&[RSD]]")); //false 交集 只能是RAD
//^ 行的开头 $ 行的结尾 /b单词边界
p("hello sir".matches("^h.*")); //true
p("hello sir".matches(".*ir$")); //true
p("hello sir".matches("^h.*\\b.*ir*")); //true
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//true
p("34343".matches("[\\w]*")); //true
p("34343".matches("\\w*")); //true
}
public static void p(Object o) {
System.out.println(o);
}
}
四. 方法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex {
public static void main(String[] args) {
// java.lang.String类中 String replaceAll(String regex, String replacement) 方法用于替换
p("asd34564565".replaceAll("\\d", "-")); //将数字替换为=
//reset , find ,start end , lookingAt 方法
Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher("00125-15245-654-0055");
p(m.matches()); //false matches用于匹配整个字符串
m.reset(); // 重置匹配器 matches已经将字符串的前几位使用之后不会将使用的字段吐出 需要经过重置将字符串恢复
p(m.find()); //find 尝试查找与该模式匹配的输入序列的下一个子序列 返回boolean
p(m.start() + "-" + m.end()); // start end 返回在以前匹配操作所捕获的子序列的初始索引 结尾词(不包含) 适合与find一起使用
p(m.find());
p(m.start() + "-" + m.end());
p(m.find());
p(m.start() + "-" + m.end());
p(m.find());
p(m.start() + "-" + m.end());
p(m.find());
p(m.lookingAt()); //从字符串开头开始匹配 只会匹配第一个出现的子序列 返回boolean
p(m.lookingAt());
}
public static void p(Object o) {
System.out.println(o);
}
}
五. 替换与分组
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex {
public static void main(String[] args) {
//替换
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); //Pattern.CASE_INSENSITIVE 不区分大小写
Matcher m = p.matcher("javajava JaVa jAva Javajava Ilovejava lovejava sdfffs javadf");
StringBuffer sbf = new StringBuffer();
int i = 0;
while(m.find()) {
p(m.group()); //group 将找到的子序列打印出来
i++;
if(i % 2 == 0) {
m.appendReplacement(sbf, "java"); //appendReplacement 将找到的一个子序列替换并添加到StringBuffer里
}else {
m.appendReplacement(sbf, "JAVA");
}
}
m.appendTail(sbf); //将剩余序列添加到缓冲区
p(sbf);
//分组 一个小括号为一个分组 组号以左括号为主
Pattern p = Pattern.compile("(\\d{3,5})([a-zA-Z]{2})");
Matcher m = p.matcher("223aa-33445vv-33445566dd-cc");
while(m.find()) {
p(m.group(1)); //group(int) 找到第一个分组的内容
}
}
public static void p(Object o) {
System.out.println(o);
}
}
六.总结
这是一一个学习日志,这篇日志写了很长时间,以后我会加快速度去学习剩下的内容.我希望能有人关注我写的内容,帮我找一些日志中的错误和不足,大家一起学习.我回将写日志的方法一直保持下去,这样可以巩固当天的学习内容,也方便以后的复习.
再多一点努力,就多一点成功.