我想使用正则表达式搜索.java
文件,我想知道是否有办法检测文件中找到匹配项的哪一行。
例如,如果我使用Java正则表达式查找匹配hello
,是否有一些方法会告诉我匹配是在第9,15和30行找到的?
答案 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的第一行的行号。
(?>\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+)
<强>参考强>
答案 1 :(得分:2)
答案 2 :(得分:0)
Java中没有可以为您完成的方法。您必须逐行读取文件并检查每行的匹配项。您可以在阅读时保留行的索引,并在找到匹配项时对该索引执行任何操作。