多行RegEx:仅匹配最后一次出现

时间:2017-07-03 09:47:45

标签: ruby regex

我有一个包含这样的Python堆栈跟踪的字符串(前后有一些不相关的文本):

Traceback (most recent call last):
  File "/workspace/r111.py", line 232, in test_assess
    exec(code)
  File "a111.py", line 17, in 
    def reset(self):
  File "/workspace/r111.py", line 123, in failed
    raise AssertionError(msg)
AssertionError: Dein Programm funktioniert nicht. Python sagt:
Traceback (most recent call last):
  File "a111.py", line 6, in 
  File "/workspace/r111.py", line 111, in runcaptured
    exec(c, variables)
  File "", line 1, in 
ZeroDivisionError: division by zero

现在我想使用多行RegEx(在Ruby中)提取发生错误的行(1File "", line 1中提取)。

/File ".*", line ([0-9]+)/效果很好,但匹配所有出现次数。我只想要最后一个。迭代目标环境中的匹配不是有效的解决方案,因为我无法改变那里的业务逻辑。

1 个答案:

答案 0 :(得分:3)

您可以使用

/(?m:.*)(?-m:File ".*", line ([0-9]+))/

<强>详情

  • (?m:.*) - 一个修改器组,其中多线标志处于打开状态,并且该点匹配任何包含换行符的换行符,该换行符尽可能多地匹配任何零个或多个字符,直到 last 发生后续子模式
  • (?-m:File ".*", line ([0-9]+)) - 另一个修改器组,其中多行标志关闭,点现在匹配任何字符但行换行符:
    • File - 一个带有空格的文字子字符串
    • ".*" - 一个双引号,除了换行符之外的任何零或毫米字符,然后是另一个双引号
    • , line - 逗号,空格,“line”substring
    • ([0-9]+) - 第1组捕获一个或多个数字。