背景

本人最近半年参与过两个从字符文本中提取相关信息需求开发,在开发过程中需要通过写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字符值内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

JAVA正则表达式提取key-value类型字符值代码实例的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  8. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

  9. Swift3.0-正则表达式 <待续>

    贡献者:赵大财博客:https://my.oschina.net/zhaodacaiGitHub:https://github.com/zhaodacai邮箱:zhaodacai@yeah.comQQ:327532817=============================先直接来代码:NSRegularExpression.OptionscaseInsensitive不区分大小写allowC

  10. 迅速 – IBInspectable创建一个下拉和更好的组织

    简而言之,我想创建一个@IBInspectable属性,使您可以在故事板中从下拉菜单中选择一系列的内容.另外如果有办法创建分隔符,更好地组织IBInspectables,我想知道这是否也可能.在我的示例中,我想为电话号码创建正则表达式字符串,以便当我去故事板时,我可以在下拉菜单中选择“电话号码”项,而不是输入正则表达式字符串.目前,我已经将一个TextField子类化,以便我可以将更多的IBIns

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部