我想使用正则表达式搜索一个
例如,如果我使用Java正则表达式查找匹配项
.java
文件,不知道是否有一种方法能够检测文件中哪些行包含匹配的内容。例如,如果我使用Java正则表达式查找匹配项
hello
,是否有一种方法可以告诉我匹配项出现在第9行、第15行和第30行?.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+)))
(?>\1?)
来实现。为了多样性,我使用了条件语句。解释
hello
并将行号捕获到第2组中。(?:^(?:(?!hello).)*(?:\r?\n))
匹配不包含hello的行。(?=[^:]+((?(1)\1):\d+))
可以带我们到第一个冒号 :
,然后外面的括号((?(1)\1):\d+))
会将第1组捕获到其中...如果设置了第1组(?(1)\1)
,则为第1组,否则为冒号和一些数字。这可以确保每次“line skipper”匹配行时,第1组扩展为:1:2:3:4:5:6:7
的更长部分。*
匹配“line skipper”零次或多次.*hello
匹配包含hello
的行(?=[^:]+((?(1)\1)+:(\d+)))
与“line skipper”中的相同,只是这次将数字捕获到第2组:(\d+)
参考资料
只需在处理(正则表达式匹配)文件之前,逐行向文件追加行号。
计算匹配组之前出现的所有换行符。
long count_NewLines = Pattern.compile("\\R")
.matcher(content.substring(0, matcher.start()))
.results()
.count() + 1;
Java中没有可以为您完成此操作的方法。您必须逐行阅读文件并检查每行是否匹配。您可以在读取它们时保留行的索引,并在找到匹配项时对该索引执行任何操作。