c# - 正则表达式解析由括号分段的数据
问题描述
我需要一个正则表达式来解析一些由方括号分段的数据。
每个数据包含 3 个部分,固定名称和预设顺序,可以与餐食进行比较。
(部分标识符:<br />[Breakfast]<br />
, <br />[Lunch]<br />
, <br />[Dinner]<br />
)
但问题是每个数据的部分或全部部分可能不存在,如下例所示,内容可能包含成对的括号以提供附加信息。
(但从不包含标识符。)
样本数据:
20181225<br />[Breakfast]<br />Fish finger sandwich [400 kcal]<br />Jellied eels<br />[Lunch]<br />Pork pies [500 kcal]<br />[Dinner]<br />Stargazy pies
20181226<br />[Dinner]<br />Stargazy pies
20181227<br />[Breakfast]<br />Fish finger sandwich [400 kcal]<br />Jellied eels<br />[Dinner]<br />Stargazy pies
20181228
期望的输出:
$date: 20181225
$breakfast: Fish finger sandwich [400 kcal]<br />Jellied eels
$lunch: Pork pies [500 kcal]
$dinner: Stargazy pies
$date: 20181226
$dinner: Stargazy pies
$date: 20181227
$breakfast: Fish finger sandwich [400 kcal]<br />Jellied eels
$dinner: Stargazy pies
$date: 20181228
我在下面尝试了正则表达式,但不能正常工作,因为贪婪的量词会忽略以下部分,即使它们存在。
(?<date>\d{8})(?:<br \/>\[Breakfast\]<br \/>(?<breakfast>.*))?(?:<br \/>\[Lunch\]<br \/>(?<lunch>.*))?(?:<br \/>\[Dinner\]<br \/>(?<dinner>.*))?
提前致谢。
解决方案
一种选择是,在每个可选组的末尾,在lazy-repeating 之后立即查找$
or 。还要将匹配的结尾锚定到字符串的末尾,以确保每个可以匹配的子组都会被匹配:<br
.
(?<date>\d{8})(?:<br \/>\[Breakfast\]<br \/>(?<breakfast>.*?(?=$|<br)))?(?:<br \/>\[Lunch\]<br \/>(?<lunch>.*?(?=$|<br)))?(?:<br \/>\[Dinner\]<br \/>(?<dinner>.*))?$
^^^^^^^^^^
https://regex101.com/r/vtCLoX/1
如果您不能指望只包含该数据的字符串,那么使用$
s 将不起作用 - 相反,after Breakfast
,在确保您没有遇到的情况下重复Lunch|Dinner
,并且 after Lunch
,在确保您没有遇到的情况下重复跨越Dinner
:
(?<date>\d{8})(?:<br \/>\[Breakfast\]<br \/>(?<breakfast>(?:(?!<br \/>\[(Lunch|Dinner)\]).)+))?(?:<br \/>\[Lunch\]<br \/>(?<lunch>(?:(?!<br \/>\[Dinner).)+))?(?:<br \/>\[Dinner\]<br \/>(?<dinner>.*))?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
推荐阅读
- mysql - 这是否可以对每个记录进行分组并求和
- java - 为什么adapter.add在android ListFragment中崩溃
- arrays - Google 表格/Excel 的评估标准
- python - python请求:如何在for循环中循环request.post?
- python - 什么是 x_train.reshape() 以及它的作用?
- python - 如何从数组的结果中删除小数点
- c++ - 如何按值对结构中的数组进行排序
- python - 如何使用变量制作 django 查询集
- c++ - C++ 预处理器不显示“扩展自”
- node.js - 如何将其他文件夹链接到 VSCODE 中的当前项目?