小编典典

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

java

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

例如,如果我寻找hello与Java正则表达式匹配的内容,是否可以通过某种方法告诉我这些匹配内容位于第9、15和30行?


阅读 220

收藏
2020-11-30

共1个答案

小编典典

可能…使用Regex Trickery!

免责声明:这并不意味着是一个实际的解决方案,而是说明了使用出色的正则表达式hack扩展的一种方式。而且,它仅在允许捕获组引用自己的正则表达式引擎上起作用。例如,您可以在Notepad
++中使用它,因为它使用了PCRE引擎,但在Java中却没有。

假设您的文件是:

some code
more code
hey, hello!
more code

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

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

(?m)(?:(?:^(?:(?!hello).)*(?:\r?\n))(?=[^:]+((?(1)\1):\d+)))*.*hello(?=[^:]+((?(1)\1)+:(\d+)))

组2将捕获包含hello的第一行的行号。

  • 演示中,请参阅右窗格中的第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+)
    --
2020-11-30