如何编写正则表达式来捕获两行?

时间:2013-07-22 14:36:56

标签: ruby-on-rails ruby regex

我需要正则表达式的帮助。 我有以下文字:

Revision: 42064
Author: dbratilov
Date: 19 июля 2013 г. 13:29:43
Message:
[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId  

----
Modified : /Analitics/Документы/ЧТЗ/BR-5454

我需要抓住[BUG]标记与符号----之间的所有内容。

[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId  

我写了这个正则表达式:

^(\W+)(BUG+)(.*+)

结果是:

[BUG] By VTBSOARVIIIS-2144

我无法捕获第二行。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

使用regex multiline modifier

s = 'Revision: 42064
Author: dbratilov
Date: 19 июля 2013 г. 13:29:43
Message:
[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId  

----
Modified : /Analitics/Документы/ЧТЗ/BR-5454'

# Note the m at the and of the regex
puts s.scan /^\W+BUG+.*?^----$/m #=>
[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId

答案 1 :(得分:1)

您可以使用此模式:

\[BUG\](?>[^\n]++|\n(?!\n-{4}))+

我们的想法是使用\n\n----作为目标字符串的结束限制。为此,您必须描述如下内容:

(?>     # open a group (atomic here, since recording backtrack positions is not needed)
[^\n]++ # all that is not a newline, one or more time (possessive for the same reason)
|       # OR
\n(?!\n-{4}) # or a newline not followed by "\n----"
)+      # repeat the group one or more times

兴趣是获得一个只有很少回溯的高性能模式,并避免出现dotall问题。

答案 2 :(得分:1)

从:

开始
text = 'Revision: 42064
Author: dbratilov
Date: 19 июля 2013 г. 13:29:43
Message:
[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId  

----
Modified : /Analitics/Документы/ЧТЗ/BR-5454
'
text =~ /^(\[BUG\].+$\n.+)$/

captures:

  $1 # => "[BUG] By VTBSOARVIIIS-2144\nTA55.1 obly for KM partyUId  "

$1是模式中第一个捕获组的简写。 http://rubular.com/r/A862gWfkvp

使用以下方法可以完成同样的事情:

text[/^(\[BUG\].+$\n.+)$/, 1]
"[BUG] By VTBSOARVIIIS-2144\nTA55.1 obly for KM partyUId  "

利用String的[]方法及其接受模式并从中返回单个捕获组的能力。

将模式更改为:

/^(\[BUG\].+)(?=^---)/m

将捕获从[BUG]扩展到----之前的行。 m标志告诉正则表达式引擎捕获"\n",就像使用.(任意字符)的普通字符一样。在这种情况下,模式意味着“捕获从^[BUG]^----之前的所有内容。

[BUG] By VTBSOARVIIIS-2144
TA55.1 obly for KM partyUId 
foo

在Rubular页面中,我添加了一条foo行,以显示它也被捕获了。 http://rubular.com/r/dtQx48UcQb