我有一些文本如下:
第一个月
直到[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
2条答案
按热度按时间5t7ly7z51#
Regex suggestion:
字符串
根据你输入的样本
型
你得到:
<134>
222
2023-06-15T23:00:27Z opchs14mlm APPID 17848 -
[flags:"278528"; ifdir:"inbound\]"; loguid:"{0x90f9aacb,0x18ca68fc,0xa48e71f3,0xc0419663}"; suppressed_logs:"1"]
希望能帮上忙。
au9on6nz2#
假设方括号没有嵌套,并且支持负先行,您可以用途:
字符串
模式匹配:
^
字符串开头(<\d+>)
捕获组1,匹配<
1+数字>
(\d+)
捕获组2,匹配1+位\s?
匹配可选的空白字符(.*?)
捕获组3,匹配任意字符,尽量少\s+
匹配1+空格字符\[
匹配[
(
捕获组4[^\\\]]*
匹配除\\
和]
以外的可选字符(?:\\+.[^\\\]]*)*
可选地重复匹配1+次\
字符后跟任何字符,然后再次匹配除\\
和]
以外的可选字符)
关闭组4]
匹配]
请参见regex demo。