JAVA正则表达式提取key-value类型字符值代码实例

2022-11-13 18:11:27 java 提取 正则表达式

背景

本人最近半年参与过两个从字符文本中提取相关信息需求开发,在开发过程中需要通过写java正则去匹配截取字符,希望通过这篇文档总结一些使用心得

先回顾一下基础知识:

方括号表达式(用于确定取值范围):

  • [xyz] :字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
  • [^xyz] :反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
  • [a-z] :字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。
  • [^a-z] :反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符
  • [a-zA-Z] : 表示是英文字母
  • [0-9] : 表示是数字

预定义字符匹配符:

  • . :匹配任意的字符
  • \d :表示数字
  • \D :表示非数字
  • \s :表示由空字符组成,[ \t\n\r\x\f]
  • \S :表示由非空字符组成,[^\s]
  • \w :表示字母、数字、下划线,[a-zA-Z0-9_]
  • \W :表示不是由字母、数字、下划线组成
  • \s :匹配任何空白字符,包括空格、制表符、换页符等

次数匹配符:

  • ? : 表示出现0次或1次
  • + : 表示出现1次或多次
  • * : 表示出现0次、1次或多次
  • {n}:表示出现n次
  • {n,m}:表示出现n~m次
  • {n,}:表示出现n次或n次以上

边界匹配符:

  • ^ :行的开头
  • $ :行的结尾

java.util.regex 包主要包括以下两个个类:

Pattern 类:

  • Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式, 
  • Pattern.complie(String regex)简单工厂方法创建一个正则表达式

Matcher 类:

  • Matcher 对象是对输入字符串进行解释和匹配操作的引擎,Pattern.matcher(CharSequence input)返回一个Matcher对象
  • Matcher.find() //返回true or false 对字符串进行匹配,匹配到的字符串可以在任何位置. 
  • Matcher.group(int i) // 返回匹配到的子字符串,m.group(1)返回第一组匹配到的子字符串

代码实例 

如果要提取 字符串为 "本端IP=177.148.165.110 本端端口=60001" 我们要提取本端IP。key值之间以空格分割

public class Test{
    public static void main( String[] args ){
 
        // 按指定模式在字符串查找 \\s作为空白符
        String line = "本端IP=177.148.165.110 本端端口=60001 ";
        String pattern = "本端IP=(.*?)(\\s)";
 
        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);
 
        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        if (m.find( )) {
            // 0 代表整个表达式。每出现一个左括号"("记做一个分组,分组编号从 1 开始。
            // 返回第一组匹配到的子字符串
            System.out.println("Found value: " + m.group(1) );
        } else {
            System.out.println("NO MATCH");
        }
    }}

1、分组

用小括号来指定子表达式(a)、(abc)、(bc)可以把多个字符当一个单独单元进行处理,本例中(.*?)创建了一个分组,代表本端IP的地址,

m.group(1) 返回匹配的输入的第一个子序列。

2、惰性匹配和贪婪匹配

(.*?) 为惰性匹配,最小匹配。本例中会提取以“本端IP=”开头,以空格结束的字符,会提取到  177.148.165.110

(.*)默认是贪婪匹配,最大匹配,它将会匹配最长的以“本端IP=”开始,以空格结束的字符,会提取到 177.148.165.110 本端端口=60001

3、分割符

假如是以“;”或者“,”分割键值对,我们可以把pattern 换成 "本端IP=(.*?)(;)"  和  "本端IP=(.*?)(,)";

如果要同时兼容 空格、“;”和“,”作为分隔符可以  pattern  换成 “本端端口=(.*?)(\\s|;|,)"

4、结束符

2 假如要提取字符串为:"本端端口=60001 本端IP=177.148.165.110"  我们要提取本端IP在字符串行尾,需要用“$”作为 结束符

public class Test{
    public static void main( String[] args ){
 
        // 按指定模式在字符串查找 $作为行末尾
        String line = "本端端口=60001 本端IP=177.148.165.110";
        String pattern = "本端IP=(.*?)($)";
 
        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);
 
        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        if (m.find( )) {
            // 0 代表整个表达式。每出现一个左括号"("记做一个分组,分组编号从 1 开始。
            // 返回第一组匹配到的子字符串
            System.out.println("Found value: " + m.group(1) );
        } else {
            System.out.println("NO MATCH");
        }
    }}

 假如要同时兼容 "本端IP=177.148.165.110 本端端口=60001" 和 "本端端口=60001 本端IP=177.148.165.110"  这两种位置 字符排列,pattern可以调整为:

  String pattern = "本端IP=(.*?)(\\s|$)";

总结

到此这篇关于JAVA正则表达式提取key-value类型字符值的文章就介绍到这了,更多相关java提取key-value字符值内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章