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

时间:2014-07-14 04:02:12

标签: java regex

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

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

3 个答案:

答案 0 :(得分:6)

可能......使用Regex Trickery!

免责声明:这并不是一个实用的解决方案,而是一个使用极好的正则表达式黑客扩展的方法的说明。此外,它仅适用于允许捕获组引用自身的正则表达式引擎。例如,您可以在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的第一行的行号。

  • the demo中,请参阅右侧窗格中的第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
  • 的较长部分
  • *将线路漫游人员编程为零次或多次
  • .*hellohello
  • 的行匹配
  • 前瞻(?=[^:]+((?(1)\1)+:(\d+)))与直线上划线员相同,只是这次数字被捕获到第2组:(\d+)
  •   -

<强>参考

答案 1 :(得分:2)

如果您使用的是基于Unix的操作系统/终端,则可以使用sed:

sed -n '/regex/=' file

(来自此StackOverflow response

答案 2 :(得分:0)

Java中没有可以为您完成的方法。您必须逐行读取文件并检查每行的匹配项。您可以在阅读时保留行的索引,并在找到匹配项时对该索引执行任何操作。