文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java中正则表达式匹配不到结果如何解决

2023-06-06 12:25

关注

这篇文章主要介绍了在Java中正则表达式匹配不到结果如何解决,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!

Java是什么

Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。

如下所示:

String str = "\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?><Response xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Header ShouldRecordPerformanceTime=\"false\" Timestamp=\"2018-6-25 21:24:03\" RequestID=\"2c4d0b24-fd48-4a92-a2d8-c66793df2059\" ResultCode=\"Success\" AssemblyVersion=\"2.9.5.0\" RequestBodySize=\"0\" SerializeMode=\"Xml\" RouteStep=\"1\" Environment=\"pro\" /><SSPATResponse><Result>0</Result><FareDetail /><Price>0</Price><ErrCode>102</ErrCode><DetailInfo>Send:APPLOCK\n" +    "Rev:\n" +    "可用资源锁定成功, 60 秒内没有输入指令资源将被Buk收回\n" +    "Send:IG\n" +    "Rev:\n" +    "NO PNR\n" +    "Send:\n" +    "SS:AA186/N/27JUN18/PEKORD/NN1;\n" +    "Rev:\n" +    "AA 186 N 27JUN PEKORD NN1 WL OPEN \n" +    "UNABLE TO SELL.PLEASE CHECK THE AVAILABILITY WITH \"AV\" AGAIN\n" +    "Send:IG\n" +    "Rev:</DetailInfo><PatOfficeno>SHA717</PatOfficeno></SSPATResponse><ResponseStatus><Timestamp xmlns=\"http://soa.ctrip.com/common/types/v1\">2018-06-25T21:24:03.4535624+08:00</Timestamp><Ack xmlns=\"http://soa.ctrip.com/common/types/v1\">Success</Ack></ResponseStatus></Response>"; String regex = "<DetailInfo>((.|\\n")*?)</DetailInfo>";

str为要匹配的字符串(是传入的),regex为正则表达式

目的是匹配出<DetailInfo>标签中的内容

在本地测试时可以匹配出来,但是在线上就不行。

真的是百思不得其解……

后来认真比对了一下线上传入的str和本地复制过来的str,发现了了一个微小的不同

线上传入的str行分隔符是\r\n,而复制粘贴到本地之后都变成了\n

而我的正则表达式中只匹配了\n的情况,因此出现这样的bug

提醒自己要注意系统之间的差别,win上的行分隔符是\n,而Linux是\r\n

为了能适配所有的环境,可以直接用System.lineSeparator()来替代,当然也可以把表达式写成这样(

<DetailInfo>((.|\\n|\\r\\n")*?)</DetailInfo>

补充:Java正则表达式匹配的坑

今天在判断字符串是否存在某个字符串,直接用String.matches(regex),死活匹配不出来,在线正则工具用了很多都是可以的,后面找到问题,总结一下,防止再次踩坑。

一、前提#

java中判断一段字符串中是否包含某个字符串的方式:

1、#

String.matches(regex);

阅读源码发现,这个方法本质是调用了Pattern.matches(regex, str),而该方法调Pattern.compile(regex).matcher(input).matches()方法,而Matcher.matches()方法试图将整个区域与模式匹配,如果匹配成功,则可以通过开始、结束和组方法获得更多信息。

即这个方法会在表达式前后加上$(regex$),是对这个字符串全匹配

而不会只匹配其中的子串,如果只想匹配子串,则需要表达式匹配整段

2、#

Pattern.compile(regex).matcher(str).find()

Matcher.find()方法则是仅仅进行匹配字串的方法

如果不想使用全局匹配则可以使用Matcher.find()方法

二、附源码#

1、String.matches(regex)#

String.matches(regex)

public boolean matches(String regex) {    return Pattern.matches(regex, this);}Pattern.matches(regex, this)
public static boolean matches(String regex, CharSequence input) {  Pattern p = Pattern.compile(regex);  Matcher m = p.matcher(input);  return m.matches();}

2、Matcher.find()#

Pattern.compile

public static Pattern compile(String regex) {    return new Pattern(regex, 0);}Pattern.matcher
public Matcher matcher(CharSequence input) {    if (!compiled) {      synchronized(this) {        if (!compiled)          compile();      }    }    Matcher m = new Matcher(this, input);    return m;}

Matcher.find()

public boolean find() {    int nextSearchIndex = last;    if (nextSearchIndex == first)      nextSearchIndex++;    // If next search starts before region, start it at region    if (nextSearchIndex < from)      nextSearchIndex = from;    // If next search starts beyond region then it fails    if (nextSearchIndex > to) {      for (int i = 0; i < groups.length; i++)        groups[i] = -1;      return false;    }    return search(nextSearchIndex);}

以上就是编程网小编为大家收集整理的在Java中正则表达式匹配不到结果如何解决,如何觉得编程网网站的内容还不错,欢迎将编程网网站推荐给身边好友。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯