在哪个行号找到正则表达式匹配?

goa*_*man 1 java regex

我想.java使用正则表达式搜索文件,我想知道是否有办法检测文件中找到匹配项的哪一行.

例如,如果我查找hello与Java正则表达式的匹配,是否有一些方法告诉我匹配是在第9,15和30行找到的?

zx8*_*x81 6

可能......与正则表达式Trickery!

免责声明:这并不是一个实用的解决方案,而是一个使用一个极好的正则表达式黑客扩展的方法的说明.此外,它仅适用于允许捕获组引用自身的正则表达式引擎.例如,您可以在Notepad ++中使用它,因为它使用PCRE引擎 - 但不是Java.

假设您的文件是:

some code
more code
hey, hello!
more code
Run Code Online (Sandbox Code Playgroud)

在文件的底部,粘贴:1:2:3:4:5:6:7,其中:是在代码的其余部分中找不到的分隔符,其中数字至少与行数一样高.

然后,要获得第一行hello,您可以使用:

(?m)(?:(?:^(?:(?!hello).)*(?:\r?\n))(?=[^:]+((?(1)\1):\d+)))*.*hello(?=[^:]+((?(1)\1)+:(\d+)))
Run Code Online (Sandbox Code Playgroud)

包含hello的第一行的行号将由Group 2捕获.

  • 演示中,请参阅右窗格中的第2组捕获.
  • 黑客依赖于一个自称的群体.在经典的@Qtax技巧中,这是完成的(?>\1?).对于多样性,我使用了条件.

说明

  • 正则表达式的第一部分是一个行队长,它捕获越来越多的底部行计数器到第1组
  • 正则表达式的第二部分匹配hello并捕获第2组的行号
  • 在队长内部,(?:^(?:(?!hello).)*(?:\r?\n))匹配一个不包含hello的行.
  • 仍然在队长中,(?=[^:]+((?(1)\1):\d+))前瞻让我们到第一个 :,[^:]+然后在((?(1)\1):\d+))捕获到组1 的外部括号...如果组1被设置(?(1)\1)然后组1,那么,无论是冒号还是一些数字.这可以确保每次线段管理器与一条线匹配时,组1会扩展到更长的一部分:1:2:3:4:5:6:7
  • *线队队员训练零次或多次
  • .*hello 匹配线 hello
  • 前瞻(?=[^:]+((?(1)\1)+:(\d+)))与行跳船中的前瞻相同,除了这次将数字捕获到第2组:(\d+)
  • -

参考