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

标签 java regex

我想使用正则表达式搜索 .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+)
  • -

引用

关于java - 在哪个行号找到正则表达式匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729354/

相关文章:

java - 如何使用 Java 查询数据存储以获取子对象并比较它们的属性?

java - 如何用java准确地写出一页文本?

javascript - 如何对我们的电话号码进行正则表达式验证而不以 0 或 1 开头?

java - Struts2-tiles-plugin 2.3.28 - StrutsTilesListener 抛出 NullPointerException

java - 绘制图形看起来像这样

php - 正则表达式在在线测试器中运行良好,但在我的页面上不起作用

php - 在 mod_rewrite 中允许百分比 (%) 符号?

java - 用于以版本格式提取数字的正则表达式

regex - 在 ActionScript 中,如何使用 RegExp 类检查给定的正则表达式是否已编译

java - 什么样的设计模式适合这里?