regex 查找数据但排除多个字符(如果它们有前缀)

zu0ti5jz  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(90)

我有一些文本如下:
第一个月
直到[data]的第一部分是头部,其余部分是方括号内的结构化数据。数据可以包含],但在结构化数据部分中始终以\\]为前缀。
使用以下方法可以正常工作:^(<\d.*>)[ ]?(\d*)\s(.*?){7}\s\[(.*)\]
问题是字符串的结尾可能会有未格式化的数据,例如。
<134>222 2023-06-15T23:00:27Z opchs14mlm APPID 17848 - [flags:"278528"; ifdir:"inbound\]"; loguid:"{0x90f9aacb,0x18ca68fc,0xa48e71f3,0xc0419663}"; suppressed_logs:"1"]some random text ] here.
并且可以,并且确实包括]。因此,正则表达式需要找到最后一个],但忽略some text ] here。我知道我可能需要使用负lookadhead,但我不能弄清楚,iidoe.com。在[]里面从来没有],但可以有\\],外面这是狂野的西部。
也就是说,我的正则表达式只有在最后没有坏数据的时候才能工作,因为我认为最后一部分是贪婪的。
样品可以在这里找到:https://regex101.com/r/PhV9pN/3

5t7ly7z5

5t7ly7z51#

Regex suggestion

^(\<\d+\>) ?(\d+) ?([^[]+)(\[(?:\w+:"[^"]+"(?:; |\]))+)

字符串
根据你输入的样本

<134>222 2023-06-15T23:00:27Z opchs14mlm APPID 17848 - [flags:"278528"; ifdir:"inbound\]"; loguid:"{0x90f9aacb,0x18ca68fc,0xa48e71f3,0xc0419663}"; suppressed_logs:"1"] some random text ] here.


你得到:

  • 组1:<134>
  • 组2:222
  • 组3:2023-06-15T23:00:27Z opchs14mlm APPID 17848 -
  • 组4:[flags:"278528"; ifdir:"inbound\]"; loguid:"{0x90f9aacb,0x18ca68fc,0xa48e71f3,0xc0419663}"; suppressed_logs:"1"]

希望能帮上忙。

au9on6nz

au9on6nz2#

假设方括号没有嵌套,并且支持负先行,您可以用途:

^(<\d+>)(\d+)\s?(.*?)\s+\[([^\\\]]*(?:\\+.[^\\\]]*)*)]

字符串
模式匹配:

  • ^字符串开头
  • (<\d+>)捕获组1,匹配< 1+数字>
  • (\d+)捕获组2,匹配1+位
  • \s?匹配可选的空白字符
  • (.*?)捕获组3,匹配任意字符,尽量少
  • \s+匹配1+空格字符
  • \[匹配[
  • (捕获组4
  • [^\\\]]*匹配除\\]以外的可选字符
  • (?:\\+.[^\\\]]*)*可选地重复匹配1+次\字符后跟任何字符,然后再次匹配除\\]以外的可选字符
  • )关闭组4
  • ]匹配]

请参见regex demo

相关问题