0

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

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

我无法捕获第二行。谁能帮我?

4

3 回答 3

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

于 2013-07-22T14:45:39.707 回答
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 问题。

于 2013-07-22T15:03:46.790 回答
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] 通过 VTBSOARVIIIS-2144
TA55.1 仅适用于 KM partyUId
富

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

于 2013-07-22T15:21:29.830 回答