我需要正则表达式的帮助。 我有以下文字:
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
我无法捕获第二行。任何人都可以帮助我吗?
答案 0 :(得分:3)
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