使用正则表达式解析括号中的数据

时间:2018-12-20 12:21:09

标签: c# regex

我需要一个正则表达式来解析一些用方括号划分的数据。

每个数据包含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>.*))?

谢谢。

1 个答案:

答案 0 :(得分:1)

一个选择是在每个重复组的结尾,在懒惰重复render '/admin/map_include_scripts' div id: 'map' do markers1 = DeliveryMarkersService.new(delivery1).orders_markers render '/admin/map_scripts', markers: markers1, map_div_id: 'map' end div id: 'map2' do markers2 = DeliveryMarkersService.new(delivery2).orders_markers render '/admin/map_scripts', markers: markers2, map_div_id: 'map2' end 之后立即对$<br进行前瞻。还要将匹配的末尾锚定到字符串的末尾,以确保可以匹配的每个子组都将被匹配:

.

https://regex101.com/r/vtCLoX/1

如果您不能指望仅包含该数据的字符串,则无法使用(?<date>\d{8})(?:<br \/>\[Breakfast\]<br \/>(?<breakfast>.*?(?=$|<br)))?(?:<br \/>\[Lunch\]<br \/>(?<lunch>.*?(?=$|<br)))?(?:<br \/>\[Dinner\]<br \/>(?<dinner>.*))?$ ^^^^^^^^^^ -在$之后,重复执行确保您没有碰到Breakfast,在Lunch|Dinner之后,请重复操作,确保您不会碰到Lunch

Dinner

https://regex101.com/r/vtCLoX/3