我在文件文件“file.txt”中有数据
食谱&菜单
专家意见
成分
假期&活动
社区
视频
夏季烹饪
扁豆和糙米汤
美食1991年1月
3.5 / 4
评论(83)
90%
再做一次 有些汤确实能激发出类似爱情的奉献精神,这就是他们中的一员。在寒冷的冬天,当美食编辑思考什么汤 库克
评论(83)
产量:大约14杯,服务6到8个 的成分
5杯鸡汤 1 1/2杯扁豆,挑选并冲洗 1杯糙米
西红柿32至35盎司,排干,保留果汁,切碎 3个胡萝卜,纵向减半,横切成1/4英寸的坯料 1个洋葱,切碎的
1根芹菜,切碎的
3个蒜瓣,切碎
1/2茶匙碎干的罗勒
1/2茶匙粉碎干燥的orégano
1/4茶匙粉碎干百里香
1月桂叶
1/2杯切碎的新鲜欧芹叶
2汤匙苹果醋,或品尝
的制备
在一个沉重的水壶中加入肉汤,3杯水,扁豆,米饭,西红柿和预留的汁液,
我想在成分和准备之间提取数据 我写了以下正则表达式: -
(?s).*?Ingredients(.*?)Preparation.*
但它正在提取成分之间的数据以斜体显示在第3行的file.txt和准备但不在成分之间的数据之间和准备
我应该对我的正则表达式代码进行哪些更改来解决此问题?
提前谢谢!
答案 0 :(得分:2)
您可以使用延迟量词.*?
和第二个.*
:
(?s).*\bIngredients\b(.*?)\bPreparation\b
请参阅demo
或者您可以使用tempered greedy token,然后您不需要第一个.*
:
(?s)\bIngredients\b(?:(?!\b(?:Ingredients|Preparation)\b).)*\bPreparation\b
请参阅demo
答案 1 :(得分:1)
(?s).*?[*]{2}Ingredients[*]{2}(.*?)[*]{2}Preparation[*]{2}.*
[*]{2}
告诉正则表达式你想要列表中的一个字符(这里只有一个*
)两次{2}
。
我更喜欢使用字符类而不是转义,我发现它们比这更具可读性:
(?s).*?\*{2}Ingredients\*{2}(.*?)\*{2}Preparation\*{2}.*
并且根据您使用的语言,您可能也必须逃避反斜杠。
答案 2 :(得分:1)
您可以使用前瞻检查每行不是Ingredients
。通过这种方式,您可以将测试次数限制为仅仅行的开头(而不是测试每个字符):
(?m)^Ingredients\R((?:(?!Ingredients$).*\R)+?)Preparation$
模式细节:
(?m) # switch on the multiline mode (^ and $ match the limit of the line)
^Ingredients\R # "Ingredients" at the start of the line followed by a new line
( # capture group 1
(?: # open a non-capturing group
(?!Ingredients$) # negative lookahead to check that the line is not "Ingredients"
.*\R # the line
)+? # repeat until "Preparation"
)
Preparation$
注意:由于您没有说明您使用的是什么正则表达式引擎,因此可能不支持\R
。在这种情况下,请将其替换为\r?\n
。
答案 3 :(得分:1)
尝试让你的第一个.*
贪婪。直到Ingredients
之前的最后一个Preparation
,它将全部吃掉(?s).*Ingredients(.*?)Preparation.*
。
String