我想.java使用正则表达式搜索文件,我想知道是否有办法检测文件中找到匹配项的哪一行.
例如,如果我查找hello与Java正则表达式的匹配,是否有一些方法告诉我匹配是在第9,15和30行找到的?
可能......与正则表达式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捕获.
(?>\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+)参考
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |