Regex查找以相同编号开始的所有行,该编号在此区域中具有特定字符串

Regex查找以相同编号开始的所有行,该编号在此区域中具有特定字符串,regex,Regex,我想找到所有的“word to find”行,不只是给我这一行作为结果,而是所有靠近结果的行,它们在行首有相同的数字 因此,在下面的示例文本中,这个正则表达式应该找到所有以777700和999900开头的行 ... 777700 K Name1*Surname Street 1 12345 Town 777700 Here is sen

我想找到所有的“word to find”行,不只是给我这一行作为结果,而是所有靠近结果的行,它们在行首有相同的数字

因此,在下面的示例文本中,这个正则表达式应该找到所有以777700和999900开头的行

    ...
 777700  K    Name1*Surname          Street 1                         12345 Town
 777700                                       Here is sentence number 1
 777700                                       Here is sentence number 2
 777700                                       Here is sentence which has word-to-find in it
 777700                                       Here is sentence number 4
 888800  K    Name2*Surname          Street 2                         12345 Town
 888800                                       Here is sentence number 1
 888800                                       Here is sentence number 2
 999900  K    Name3*Surname          Street 3                         12345 Town
 999900                                       Here is sentence number 1
 999900                                       Here is sentence number 2
 999900                                       Here is sentence which has word-to-find in it

哦,这比我一开始想的要复杂。以下是我的解决方案:

^(\d+)\b(?=(?:(?!^(?!\1\b)).)*word-to-find)(?:(?!^(?!\1\b)).)*
为您正在使用的正则表达式风格使用
gms
修饰符(全局匹配、点匹配全部、
^
匹配行开头)。在Sublime(我不知道)中,您可能应该在正则表达式的最开始添加
(?sm)
,以实现这一点

请用更多的案例进行测试

说明:

^#行首
(\d+)匹配并捕获一个数字(第1组)
\b#确保我们匹配整个数字
(?=#现在断言从现在起可以匹配以下内容:
(?:#非捕获组的开始:
(?!#仅当无法匹配时才允许匹配。。。
^(?!\1\b)#…一行的开头,后跟与\1不同的数字
)#负前瞻结束
.#然后匹配任何字符
)*#任意次数
要查找的单词和我们的搜索字符串。
)#积极前瞻的结束
(?:#现在我们知道搜索字符串在那里,让我们进行实际匹配:
(?!^(?!\1)\b)#一直延伸到后面以不同数字开头的一行
.#匹配任意字符
)*#任意次数

在这种情况下,我更喜欢:

  • 添加显式记录分隔符
    §
    (用
    §$0
    替换
    ^(\d+).*(\n\1.*)
  • 执行我需要的处理(例如:查找
    ^[^§]*word以查找[^§]*
  • 拆下分离器

(未经测试:空格、单词边界可能需要一些额外的工作)

您的问题是什么?您在解决问题的哪一部分时遇到困难?您使用的是什么语言/工具?我的意思是,我得到了“要查找的单词”行,例如
^.+word to find.+$
。但是当它们以相同的数字开始时,我也需要在这一行之前(和/或之后)的行@Aaron使用升华文本编辑器进行hihglighting/复制结果…可能是一个类似
(777700 | 999900)的表达式*(?:\1)[^\n]*
gs
修饰符。@MoisheLipsker我不知道这个起始数字…。看起来不错!!!一个细节。。行首数字前可能有一些空格@我用来突出显示结果的Tamas Rev程序是“升华文本”编辑器。@Heart1010:在同一块的所有行中,空格是否一致?如果是这种情况,只需将
[\t]*
添加到
\d+
之前的捕获组。如果不是,则直接在regex.Perfect中的每个
^
之后添加它!在您的regex101链接上创建了版本3,它与行开头的空格完美配合。对于崇高的文本,就像您在正则表达式前面提到的(?sm):
(?sm)^([\t]*\d+)\b(?=(?:(?!^(?!\1\b))**要查找的单词)(?:(?!^(?!\1\b))*
@TimPietzcker,非常酷!(+1). 然而,在这种情况下,我更喜欢间接的解决方案:请看我的答案。