当前位置: 首页 > 面试题库 >

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

萧和同
2023-03-14
问题内容

我想.java使用正则表达式搜索文件,不知道是否有一种方法可以检测到文件中找到匹配项的行。

例如,如果我寻找hello与Java正则表达式匹配的内容,是否可以通过某种方法告诉我这些匹配内容位于第9、15和30行?


问题答案:

可能…使用Regex Trickery!

免责声明:这并不意味着是一个实际的解决方案,而是说明了使用出色的正则表达式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+)))

组2将捕获包含hello的第一行的行号。

  • 在演示中,请参阅右窗格中的第2组捕获。
  • 黑客依赖于指称自己的团体。在经典的@Qtax技巧中,这是通过完成的(?>\1?)。为了实现多样性,我改用了有条件的。

说明

  • 正则表达式的第一部分是跳线器,它捕获到组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+)
    --


 类似资料:
  • 出于某种原因,上面的正则表达式没有捕捉带撇号的名称。 例如:D'STALL先生不匹配。任何关于regex模式的帮助都将不胜感激。 代码所做的是获取输入并用XML标记它。诸如以下内容: 正则表达式与上述段落不匹配。

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 问题内容: 我有类似的东西 商店 结束行像1商店..我想匹配,它使用python正则表达式。 我尝试了类似的方法, 但是没有用。 编辑:添加代码,我试过 请帮助。 谢谢吉乔 问题答案: 或多或少直接回复您的评论 尝试这个 解决方案是使用,而不是使用后者,因为后者试图将整个字符串与regexp匹配,而前者只是试图在字符串内部查找与表达式匹配的子字符串。

  • 我们得到了一些这样的内容:

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我正在尝试匹配以下正则表达式: 换句话说,一个单词边界后跟上面的任何字符串(可选地跟一个句点字符),后面跟一个单词边界。 我也在regex101上尝试过这一操作,但与数仍然不匹配:https://regex101.com/r/klkmwl/1 转义符并没有什么区别,我已经尝试使用十六进制转义序列来代替和符(如本问题所建议的)。为什么这不匹配?