我需要一个正则表达式来解析一些用方括号划分的数据。
每个数据包含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>.*))?
谢谢。
答案 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