用 Java 正则表达式从字符串中提取嵌套的子字符串_java如何从字符串中提取多个特定字符之间的子字符串-程序员宅基地

技术标签: java  实用技巧  正则表达式  

 假设有下面一段文字:

A: "Do you want tickets for tonight?"
B: "What's the movie tonight?"
A: "It's \"The Batman\"."

用 Java 字符串把这段文字写出来就是:

String dialogue = 
    "A: \"Do you want tickets for tonight?\" " +
    "B: \"What's the movie tonight?\" " +
    "A: \"It's \\\"The Batman\\\".\""

接下来的任务是用 Java 正则表达式从 dialogue 中提取出三句对话的内容,即需要输出如下内容:

>> Do you want tickets for tonight?
>> What's the movie tonight?
>> It's "The Batman".

咱们先写出代码框架:

Pattern pattern = Pattern.compile("");
Matcher m = pattern.matcher(dialogue);

while (m.find()) {
    String var = str.substring(m.start(), m.end());
    System.out.print(">> ");
    System.out.println(var.replaceAll("\\\\\"","\"").replaceAll("^\"|\"$", ""));
}

 然后就是写最关键的正则表达式了。如果只是简单地查找两个双引号之间的内容,并不能输出想要的结果:

Pattern pattern = Pattern.compile("\"(.*)\"");

....

输出:
>> Do you want tickets for tonight?" B: "What's the movie tonight?" A: "It's \"The Batman\".

正确的写法是:

Pattern pattern = Pattern.compile("\"([^\\\\\"]*(\\\\.)*)*\"");

这个看起来真头大,下面详细解释一下。

为了方便理解,首先去掉 Java 字符串的转义字符,就变成了下面的样子:

"([^\\"]*(\\.)*)*"

各个部分逐一解释如下:

" 匹配开头的双引号
([^\\"]*(\\.)*)* 对 [^\\"]*(\\.)* 循环若干次,可以是0次。在正则表达式中,两个反斜杠(\\)表示一个实际的反斜杠字符(\)
[^\\"]* 排除单独出现的反斜杠(\)和双引号(")。这个的效果是每当遇到单独的双引号,说明这个子字符串已经结束了,要停止继续往后匹配
(\\.)* 允许由反斜杠(\)转义后任意字符留在子字符串中。在这里的作用是不把 \" 看作两个单独的字符,而是看做一个被转义了的双引号
" 匹配结尾的双引号

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010144368/article/details/127912606

智能推荐

Dev C++下载地址和安装教程(图解)_dev c++官方-程序员宅基地

文章浏览阅读1.4w次,点赞8次,收藏19次。Dev C++下载地址和安装教程(图解)Dev C++ 是一款免费开源的 C/C++ IDE,内嵌 GCC 编译器(GCC 编译器的 Windows 移植版),是 NOI、NOIP 等比赛的指定工具。Dev C++ 的优点是体积小(只有几十兆)、安装卸载方便、学习成本低,缺点是调试功能弱。安装 Dev C++ 跟安装普通软件一样,远没有安装 VS 那么复杂。截止到2017年06月07日,Dev C++ 的最新版本是 5.11。Dev C++ 5.11 简体中文版下载地址:官方下载:https://_dev c++官方

测试阶段-简介_bug发现的越晚-程序员宅基地

文章浏览阅读347次。*测试应该尽早的进行, bug发现越晚修复代价越大。如果根据软件测试的阶段来进行分类的话, 测试分为以下几个阶段:单元测试,集成测试,系统测试和验收测试。单元测试:对软件中最小可测试单元进行检查和验证(可以认为是测试的最小模块)单元测试的原则:- 尽可能保证各个测试用例都是互相独立的例如,以下是一个测试登录的错误的脚本:因为调用了getpassFromDB的依赖方法,出现错误无法判断是测试方法出错..._bug发现的越晚

C语言 trim 函数_c语言 trim函数-程序员宅基地

文章浏览阅读1w次。实现C语言中用于对字符串的trim处理#include #include void trim(char *s) { char *start; char *end; int len = strlen(s); start = s; end = s + len - 1; while (1) {_c语言 trim函数

PCMCIA转USB host 和 串口芯片OXCFU950_oxford semiconductor-程序员宅基地

文章浏览阅读1.4k次。牛津半导体(Oxford Semiconductor)发布了型号为OXCFU950的全新控制器。该款产品集16位PC卡主机接口、USB 2.0全速主机控制器和UART为一身,为下一代高速PC和闪存卡在3G手机、移动TV和无线网络产品中的应用提供了更多的灵活性。这款低成本高效能的芯片同时支持PCMCIA revision 8.0和Compact Flash revision 3.0规范,可为笔记_oxford semiconductor

html程序员表白前端网页源码 3D动态相册制作html_web前端网站源码-程序员宅基地

文章浏览阅读77次。网站文件方面:html网页结构文件、css网页样式文件、js网页特效文件、images网页图片文件;网页编辑方面等任意html编辑软件进行运行及修改编辑等操作)。其中:(1)html文件包含:其中index.html是首页、其他html为二级页面;(2) css文件包含:css全部页面样式,3D动态效果,雪花飘落等等(3) js文件包含:页面炫酷效果实现。_web前端网站源码

android menu枚举,Android 修改Menu字体颜色和背景-程序员宅基地

文章浏览阅读581次。我们知道,在Android中修改TextView的字体颜色,一般是通过setTextColor()方法。虽说Android的Menu菜单项的每一项都是由TextView组成,但是Android的sdk并没有给出具体设置Menu的颜色的api。一般我们只能通过修改Theme来间接修改Menu的样式,但如果需要对单独的某一个Menu修改颜色,这种方法又不行了。stackoverflow上提出了另外一种..._android studio修改menu菜单背景

随便推点

vue中使用jsx语法_$st语法怎么使用在vue中-程序员宅基地

文章浏览阅读1.1k次。vue-jsx_$st语法怎么使用在vue中

Ginkgo USB-CAN分析仪 中继 兼容ZLG CANopen DeviceNet J1939分析_j1939上位机-程序员宅基地

文章浏览阅读798次。品牌:ViewTool/纬图型号:VTG203B典型应用:- 通过PC的USB接口对CAN总线网络进行数据发送和接收;- 工业现场CAN网络数据监控;- 汽车CAN总线应用;- CAN网络诊断与测试;- CAN网络数据采集、数据分析;- CAN总线-USB网关,延长CAN总线的网络通讯长度;- USB接口转CAN网络接口; 功能:- 支持Windows、Linux、..._j1939上位机

删除数据库恶意脚本-程序员宅基地

文章浏览阅读72次。USE DataBaseNameGODECLARE @MAXID INTDECLARE @ID INTDECLARE @SQL NVARCHAR(MAX)DECLARE @TableName NVARCHAR(100)SET @ID = 0SELECT TOP 1 @MAXID = id FROM sysobjects WHERE [type] = 'U' ORDER BY id..._数据库恶意脚本

SQLite入门到精通之八:条件语句(Where|AND/OR|Like|Limit)_sqlite 条件选择语句-程序员宅基地

文章浏览阅读2.4k次。SQLiteWhere 子句SQLite的WHERE子句用于指定从一个表或多个表中获取数据的条件。如果满足给定的条件,即为真(true)时,则从表中返回特定的值。您可以使用 WHERE 子句来过滤记录,只获取需要的记录。WHERE 子句不仅可用在 SELECT 语句中,它也可用在 UPDATE、DELETE 语句中,等等,这些我们将在随后的章节中学习到。语法SQLite ..._sqlite 条件选择语句

nginx设置跨域_nginx access-control-allow-origin-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏5次。1.CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。当前几乎所有的浏览器(Internet Explorer 8+, Firefox 3.5+, Safari 4+和 Chrome 3+)都可通过名为跨域资源共享(Cross-Origi..._nginx access-control-allow-origin

android中TextView中文字体粗体的方法 (android:textStyle="bold"来使字体显示为粗体,但是这只对英文有效)_andriod xml texview blod-程序员宅基地

文章浏览阅读1.7w次。TextView在xml中可以定义android:textStyle="bold"来使字体显示为粗体,但是这只对英文有效,当你的TextView要显示中文的时候要在code中设置粗体的paint来实现,如下:1 TextView title = new TextView(context);//或从xml导入2 TextPaint paint = title.getPaint();_andriod xml texview blod

推荐文章

热门文章

相关标签