• Java正则表达式——Java筑基


    正则表达式定义了字符串的模式。
    正则表达式可以用来搜索、编辑或者是处理文本。
    正则表达式并不仅仅局限于某种语言,但是在每个语言中都有差异。


    正则表达式实例

    一个字符串就是一个简单的正则表达式,例如Hello world正则表达式匹配“Hello world”的字符串。

    .就是一个正则表达式,匹配任意一个字符例如:“a”或者“1”。

    给出如图所示的正则表达式实例:
    在这里插入图片描述

    Java正则表达式和Perl很类似。
    java.util.regex包主要包含了如下三个类:

    • Pattern类:
      pattern对象是一个正则表达式的编译表示。Pattern类没有公共的构造方法,首先调用其公共静态方法,返回一个Pattern对象,该方法接受一个正则表达式作为其第一个参数。
    • Matcher类:
      Matcher对象是对输入的字符串进行解释和匹配操作的引擎,和Pattern类一样,没有公共的构造方法,需要调用Pattern对象的Matcher方法获得一个该类对象。
    • PatternSyntaxException:
      PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

    给出如下实例代码:

    package regex;
    
    import java.util.regex.Pattern;
    
    public class RegexExample1 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String content = "I am runoob" + "from runoob.com";
    		String pattern = ".*runoob.*";
    		boolean isMatch = Pattern.matches(pattern, content);
    		System.out.println("字符串是否包含了'runoob'的字符串?: " + isMatch);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    捕获组

    捕获组是把多个字符当一个单独的单元进行了处理的方法,通过对括号内的字符分组来创建。
    例如,正则表达式(dog)创建了一个单一分组,组里包含"d",“o”,和"g"。
    捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

    • ((A)(B( C)))
    • (A)
    • (B( C))
    • ( C)

    通过调用matcher对象的groupCount方法查看表达式有多少个分组。groupCount方法返回一个int数值,表示matcher对象当前有多个捕获的组。
    还有一个特殊的组(group(0)),它总是代表整个表达式。该组不在groupCount的返回值中。

    给出如下实例代码:

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexMatches {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// 按照指定模式在字符串中查找
    		String line = "This order wa placed for QT3000! OK?";
    		String pattern = "(\\D*)(\\d+)(.*)";
    
    		// 创建pattern对象
    		Pattern r = Pattern.compile(pattern);
    
    		// 现在创建了matcher对象
    		Matcher m = r.matcher(line);
    		if (m.find()) {
    			System.out.println("Found value: " + m.group(0));
    			System.out.println("Found value: " + m.group(1));
    			System.out.println("Found value: " + m.group(2));
    			System.out.println("Found value: " + m.group(3));
    		} else {
    			System.out.println("NO MATCH");
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    结果如图所示:
    在这里插入图片描述


    正则表达式语法

    在其他的语法中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
    在Java中,\\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

    System.out.print("\\");    // 输出为 \
    System.out.print("\\\\");  // 输出为 \\
    
    • 1
    • 2

    语法详细可以参见这篇文章:Java正则表达式语法示例大全

    匹配验证Email是否正确

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class checkEmail {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// 验证的字符串
    		String str = "service@xsoftlab.net";
    		// 邮箱验证的规则
    		String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
    		// 编译正则表达式
    		Pattern pattern = Pattern.compile(regEx);
    		// 忽略的大小写的方法
    		Matcher matcher = pattern.matcher(str);
    		// 字符串是否正则表达式匹配
    		boolean rs = matcher.matches();
    		System.out.println(rs);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    字符串中查询字符或者字符串

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 
     * @ClassName: regexMatchDemo2
     */
    public class regexMatchDemo2 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// 要验证的字符串
    		String str = "baike.xsoftlab.net";
    		// 正则表达式规则
    		String regEx = "baike.*";
    		// 编译正则表达式
    		Pattern pattern = Pattern.compile(regEx);
    		// 忽略大小写的写法
    		// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
    		Matcher matcher = pattern.matcher(str);
    		// 查找字符串中是否有匹配正则表达式的字符/字符串
    		boolean rs = matcher.find();
    		System.out.println(rs);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 “\b” 与单个退格字符匹配,而 “\b” 与单词边界匹配。字符串字面值 “(hello)” 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 “hello”。


    Matcher类方法

    索引方法

    索引方法提供了有用的缩影数值,精确表明输入字符串中在哪儿能找到匹配:

    • public int start()
      返回以前匹配的初始索引。
    • public int start(int group)
      返回以前的匹配操作期间,由给定的组所捕获的子序列的初始索引。
    • public int end()
      返回最后匹配的字符之后的偏移量。
    • public int end(int group)
      返回在以前的匹配操作期间,给定组所捕获的子序列的最后字符之后的偏移量。

    查找方法

    查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

    • public boolean lookingAt()
      尝试将从区域开头开始的输入序列与该模式匹配。
    • public boolean find()
      尝试查找与该模式匹配的输入序列的下一个子序列。
    • public boolean find(int start)
      重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
    • public boolean matches()
      尝试将整个区域与模式匹配。

    start和end方法

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class regexStartEnd {
    	private static final String REGEX = "\\bcat\\b";
    	private static final String INPUT = "cat cat cat cattie cat";
    
    	public static void main(String[] args) {
    		Pattern p = Pattern.compile(REGEX);
    		// 获取 matcher 对象
    		Matcher m = p.matcher(INPUT);
    		int count = 0;
    
    		while (m.find()) {
    			count++;
    			System.out.println("Match number " + count);
    			System.out.println("start(): " + m.start());
    			System.out.println("end(): " + m.end());
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引;end 方法最后一个匹配字符的索引加 1。


    matches 和 lookingAt 方法

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class replaceFirstAll {
    	private static String REGEX = "dog";
    	private static String INPUT = "The dog says meow. " + "All dogs say meow.";
    	private static String REPLACE = "cat";
    
    	public static void main(String[] args) {
    		Pattern p = Pattern.compile(REGEX);
    		// get a matcher object
    		Matcher m = p.matcher(INPUT);
    		INPUT = m.replaceAll(REPLACE);
    		System.out.println(INPUT);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    replaceFirstreplaceAll 方法用来替换匹配正则表达式的文本。

    注意,不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

    appendReplacement 和 appendTail 方法

    Matcher类提供了appendReplacement 和 appendTail 方法用于文本替换:

    package regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexMatchTest {
    	private static String REGEX = "a*b";
    	private static String INPUT = "aabfooaabfooabfoobkkk";
    	private static String REPLACE = "-";
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Pattern p = Pattern.compile(REGEX);
    		// 获取 matcher 对象
    		Matcher m = p.matcher(INPUT);
    		StringBuffer sb = new StringBuffer();
    		while (m.find()) {
    			m.appendReplacement(sb, REPLACE);
    		}
    		m.appendTail(sb);
    		System.out.println(sb.toString());
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    关于python中round方法在一些四舍五入时丢失精度
    Linux系统调用
    Yii使用queue实现队列
    RK3588开发笔记-USB3.0接口调试
    Ceres 三部曲 之 入门简介
    读取图片文件MetaFile放入Windows剪切板
    大语言模型 (LLM) 红队测试:提前解决模型漏洞
    vue3快速入门-生命周期
    vue3 斗兽棋游戏
    怎样去优化JAVA中的实现代码
  • 原文地址:https://blog.csdn.net/qq_42544728/article/details/126361218