将文本(a..b)与单词(a)的最后一次出现匹配,直到第一次出现另一个单词(b)

时间:2014-07-03 05:59:45

标签: ruby regex

在以下输入上使用正则表达式:

输入

response {
   id: 1
   files: 1.bin
   major: 338013710701
   status: Received
}
response {
   id: 1
   files: 1.bin
   major: 35723057325
   status: Valid
}
response {
   id: 1
   files: 1.bin
   major: 27151510570
   status: Accepted
}

我期待匹配的输出:

预期输出

response {
   id: 1
   files: 1.bin
   major: 27151510570
   status: Accepted

其中id: 1是匹配所必需的。我尝试使用以下正则表达式执行此操作:

/response {\n {3}id: 1.*?status: Accepted/m

并从第一个responsestatus: Accepted进行选择。任何人都可以帮助构建正确的正则表达式以匹配预期的输出吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下正则表达式来匹配包含字符串status: Accepted的响应块,

/response\s*\{\n[^\n]*\n[^\n]*\n[^\n]*\n\s*status: Accepted/m

DEMO

<强>解释

  • response匹配文字字符串响应。
  • \s* Zeror或更多空格。
  • {文字{符号。
  • \n匹配换行符。
  • [^\n]*匹配任何字符,而不是换行符号为零或更多次。
  • \n匹配换行符。
  • [^\n]*匹配任何字符,而不是换行符号为零或更多次。
  • \n\s*换行符和零个或多个空格。
  • status: Accepted匹配字符串status: Accepted

<强>更新

你也可以使用这个正则表达式,

/response {[\s\n\w\.:]*id:\s*1[\s\n\w\.:]*status: Accepted/m

DEMO

答案 1 :(得分:0)

使用它:

/(.*(response.*?status: Accepted))/s

你将在第二个反向引用中得到它

\2$2

演示:http://regex101.com/r/aO2qD8/1