我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍了在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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了在Java中正则表达式匹配不到结果如何解决,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和
2023-06-06

Java如何从上次多字节正则表达式匹配中检索结果

Java提供了Matcher类来检索正则表达式匹配结果,适用于多字节字符。Matcher方法包括start()、end()、group()和groupCount(),可分别获取匹配开始结束索引、匹配字符串、指定组匹配和组数。需要注意的是,Java使用UTF-16存储字符串,多字节字符的代码点索引与字节索引不一致,因此需要使用Character.offsetByCodePoints()方法进行转换。
Java如何从上次多字节正则表达式匹配中检索结果
2024-04-02

如何在 Go 中用正则表达式匹配 IP 地址?

如何在 go 中使用正则表达式匹配 ip 地址?正则表达式语法:^(([0-9]|1-9|1[0-9]{2}|20-4|25[0-5]).){3}([0-9]|1-9|1[0-9]{2}|20-4|25[0-5])$go 代码示例:使用 r
如何在 Go 中用正则表达式匹配 IP 地址?
2024-05-13

PHP如何从上次多字节正则表达式匹配中检索结果

本指南详细介绍了PHP中使用preg_match_all函数从多字节正则表达式匹配中检索结果的方法。通过理解如何获取特定匹配、多个匹配以及处理多字节字符,开发者可以有效地从正则表达式匹配中提取所需信息。此外,文中强调了避免灾难性回溯的重要性,并提供了预防措施。
PHP如何从上次多字节正则表达式匹配中检索结果
2024-04-02

Java如何多字节支持正则表达式匹配

Java正则表达式支持多字节字符匹配,需要启用Unicode支持。可以使用特定的字符类(p{L}、p{M}、p{Z})匹配多字节字符,并利用语法扩展(多字节边界匹配、字符范围、Unicode转义)处理多字节数据。需要注意正则表达式引擎因JVM实现而异,Unicode字符处理性能较低,某些功能行为在Unicode模式下可能不同。
Java如何多字节支持正则表达式匹配
2024-04-02

Java如何多字节正则表达式匹配的设置字符串和正则表达式

摘要:在Java中使用多字节正则表达式时,需要设置字符串和正则表达式:设置字符串:编码为多字节方案(如UTF-8)转义特殊字符设置正则表达式:使用(?u)启用unicode模式使用多字节边界标记(?u)使用字符类(p{L})匹配多字节字符使用转义序列(uD83DuDE0A)匹配特定字符使用非贪婪限定符(*?)限制匹配
Java如何多字节正则表达式匹配的设置字符串和正则表达式
2024-04-02

在Java中使用正则表达式匹配${key}的方法

这篇文章将为大家详细讲解有关在Java中使用正则表达式匹配${key}的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.正则表达式匹配${key}\$\{([a-z]+)\} 能够匹配字符串中以${
2023-06-07

如何在Python中使用正则表达式进行模式匹配

正则表达式是一种强大的文本匹配工具,可以在Python中使用re模块来进行模式匹配。以下是使用正则表达式进行模式匹配的一般步骤:
如何在Python中使用正则表达式进行模式匹配
2024-02-22

JAVA正则表达式匹配多个空格的解决方案

这篇文章主要介绍了JAVA正则表达式匹配多个空格的解决方案,文中提到了()和[]本质的区别,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-16

如何在 Go 中使用正则表达式匹配时间戳?

在 go 中,可以使用正则表达式匹配时间戳:编译正则表达式字符串,例如用于匹配 iso 8601 时间戳的表达式:^\d{4}-\d{2}-\d{2}t\d{2}:\d{2}:\d{2}(\.\d+)?(z|[+-][0-9]{2}:[0-
如何在 Go 中使用正则表达式匹配时间戳?
2024-05-14

如何在 Golang 中替换正则表达式匹配的文本?

在 go 中,可使用 regexp.replaceall 函数替换符合正则表达式的文本,该函数需要三个参数:待替换字符串、匹配模式和替换文本。例如,将字符串中 "fox" 替换为 "dog":编译正则表达式模式 "fox"。使用 repla
如何在 Golang 中替换正则表达式匹配的文本?
2024-05-14

VBS中正则表达式如何实现字符匹配

这篇文章主要介绍了VBS中正则表达式如何实现字符匹配,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。字符匹配句点 (.) 匹配一个字符串中任何单个的打印或非打印字符,除了换行符
2023-06-09

Java如何多字节字符串的正则表达式匹配

本文详细介绍了如何在Java中使用正则表达式匹配多字节字符串。它涵盖了字符编码(UTF-16和UTF-8)、正则表达式匹配的注意事项、匹配示例以及最佳实践。Java中的多字节字符串匹配遵循Unicode规范和所使用的字符编码。正确理解这些概念对于确保程序精确匹配国际化文本数据至关重要。
Java如何多字节字符串的正则表达式匹配
2024-04-02

正则表达式如何在java中使用

正则表达式如何在java中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java中正则表达式运用实例(参看java中正则表达式运用详解):测试代码 pack
2023-05-31

Java如何返回多字节正则表达式的匹配部分

本文介绍了如何在Java中通过正则表达式匹配多字节字符集(MBCS)并返回匹配部分。它涵盖了使用Pattern和Matcher类、Unicode属性和Unicode块枚举、Unicode字符边界,以及字符编码和性能优化方面的考虑因素。通过遵循这些指南,开发者可以准确地返回多字节正则表达式的匹配部分并处理复杂的文本数据。
Java如何返回多字节正则表达式的匹配部分
2024-04-02

C#中如何使用正则表达式和字符串匹配

C#中如何使用正则表达式和字符串匹配正则表达式是一种强大的文本处理工具,它可以帮助我们有效地在字符串中进行模式匹配和提取。在C#中,通过使用System.Text.RegularExpressions命名空间下的Regex类,我们可以轻松地
2023-10-22

如何实现SITA报文解码匹配的正则表达式

小编给大家分享一下如何实现SITA报文解码匹配的正则表达式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SITA报文解码匹配的正则表达式一、SITA报文ZCZC
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录