我想使用正则表达式搜索 .java
文件,我想知道是否有一种方法可以检测文件中找到匹配项的行。
例如,如果我用 Java 正则表达式查找匹配项 hello
,是否会有某种方法告诉我在第 9、15 和 30 行找到了匹配项?
最佳答案
可能...使用正则表达式技巧!
免责声明:这并不是一个实用的解决方案,而是说明一种使用非常棒的正则表达式 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+)))
第一行包含hello的行号会被Group 2捕获。
- 在the demo ,请参阅右 Pane 中的第 2 组捕获。
- 黑客攻击依赖于一个引用自身的组。在经典的@Qtax 技巧中,这是通过
(?>\1?)
完成的。为了多样性,我改用了条件句。
解释
- 正则表达式的第一部分是一个跳行器,它在底部捕获越来越多的行计数器到第 1 组
- 正则表达式的第二部分匹配
hello
并将行号捕获到第 2 组 - 在 line skipper 中,
(?:^(?:(?!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+)))
与 line skipper 中的相同,除了这个将数字捕获到第 2 组的时间:(\d+)
-
引用
- > Qtax trick (最近获得了@AmalMurali 的额外赏金)
- > Replace a word with the number of the line on which it is found
关于java - 在哪个行号找到正则表达式匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729354/