正则表达式:在边界定义的组中,仅当XX时匹配

时间:2018-08-08 18:05:17

标签: regex

上下文:我正在尝试过滤一些日志,并且无法更改它们的生成方式。它们的外观基本上是:

Some text here AAA
Some text here One
Some More text here
******
Some text here BBB
Some text here Two
Some More text here
******
Some text here CCC
Some text here Three
Some More text here
******
Some text here BBB
Some text here Four
Some More text here
******
Some text here BBB
Some text here Five
Some More text here
******

基本上,每个******都划出一个新的日志事件

我正在尝试获取一个正则表达式来匹配位于两个******之间的每个块,其中每个BBB包含******。 (我知道第一个不是以******开头的,但是出于复杂性考虑,我不匹配那个就可以了)

我试图做的基本上是“用******分隔但在两者之间没有另一个\*{6}(?!\*{6}).*BBB.*\*{6}定义一个潜在的匹配”,但是我不知道该怎么写。因此,在上述示例中,它将匹配包含两个,四个和五个的块。

我尝试了多种变体,例如:{{1}}

有什么提示吗?

编辑:我使用的regex版本是Notepad ++ / VisualStudio和Regex101.com中的PCRE(php)。

3 个答案:

答案 0 :(得分:3)

您可以在PCRE中使用此正则表达式:

(?:\A|\*{6})(?:(?!\*{6}).)*?BBB.*?(?=\R\*{6})

RegEx Demo

正则表达式详细信息:

  • (?:\A|\*{6}):比赛开始或******
  • (?:(?!\*{6}).)*?:匹配0个或多个前面没有******的字符
  • BBB.*?:匹配BBB,后跟0个或更多字符
  • (?=\R\*{6}):使用前瞻断言我们******在下一个位置

答案 1 :(得分:2)

您需要什么:

^[^*]+\bB{3}\b[^*]+$

Regex Demo

这说明:

  • ^断言从行首开始
  • [^*]+后跟许多不是*的字符
  • \bB{3}\b匹配三个有界的B。
  • [^*]+后跟许多不是*的字符
  • $结束一行

答案 2 :(得分:0)

尝试以下操作:(?<=\*{6}\s)(?=.*B{3})[^(?>\*{6})]+

它使用正向后方匹配六个星星,后跟空白(例如换行,也可以使用\n):(?<=\*{6}\s)

然后,它使用肯定的前瞻方式确保以下文本包含BBB(?=.*B{3})

然后,由于置位,它捕获了直到下一个六点的所有东西,这排除了六颗星的出现(因为我将其定为原子(?>\*{6}))。

Demo