上下文:我正在尝试过滤一些日志,并且无法更改它们的生成方式。它们的外观基本上是:
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)。
答案 0 :(得分:3)
您可以在PCRE中使用此正则表达式:
(?:\A|\*{6})(?:(?!\*{6}).)*?BBB.*?(?=\R\*{6})
正则表达式详细信息:
(?:\A|\*{6})
:比赛开始或******
(?:(?!\*{6}).)*?
:匹配0个或多个前面没有******
的字符BBB.*?
:匹配BBB
,后跟0个或更多字符(?=\R\*{6})
:使用前瞻断言我们******
在下一个位置答案 1 :(得分:2)
您需要什么:
^[^*]+\bB{3}\b[^*]+$
这说明:
^
断言从行首开始[^*]+
后跟许多不是*
的字符\bB{3}\b
匹配三个有界的B。 [^*]+
后跟许多不是*
的字符$
结束一行答案 2 :(得分:0)
尝试以下操作:(?<=\*{6}\s)(?=.*B{3})[^(?>\*{6})]+
。
它使用正向后方匹配六个星星,后跟空白(例如换行,也可以使用\n
):(?<=\*{6}\s)
。
然后,它使用肯定的前瞻方式确保以下文本包含BBB
:(?=.*B{3})
。
然后,由于置位,它捕获了直到下一个六点的所有东西,这排除了六颗星的出现(因为我将其定为原子(?>\*{6})
)。