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

JAVA正则表达式提取key-value类型字符值,第1张

JAVA正则表达式提取key-value类型字符

目录

背景

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

预定义字符匹配符:

次数匹配符:

边界匹配符:

代码实例 


背景

本人最近半年参与过两个从字符文本中提取相关信息需求开发,在开发过程中需要通过写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 :表示由空字符组成,[ tnrxf]

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|$)";

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5677275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存