多行正则表达式:仅匹配最后一次出现

Par*_*wir 3 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
Run Code Online (Sandbox Code Playgroud)

现在我想使用多行正则表达式(在 Ruby 中)1提取发生错误的行(从 中提取File "", line 1)。

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

Wik*_*żew 5

您可以使用

/(?m:.*)(?-m:File ".*", line ([0-9]+))/
Run Code Online (Sandbox Code Playgroud)

细节

  • (?m:.*)- 一个修饰符组,其中多行标志打开并且点匹配任何字符,包括尽可能多地匹配任何零个或多个字符的换行符字符,直到最后一次出现后续子模式
  • (?-m:File ".*", line ([0-9]+)) - 另一个修饰符组,其中多行标志关闭,点现在匹配除换行符以外的任何字符:
    • File - 一个文字子串,后面有一个空格
    • ".*" - 双引号,除换行符之外的任何零个或多个字符,然后是另一个双引号
    • , line - 逗号、空格、“行”子字符串
    • ([0-9]+) - 第 1 组捕获一位或多位数字。