用于在嵌套文本之间提取一些参数值的正则表达式
Regex to extract some parameters values between nested text
我有以下输入文本,我想用正则表达式提取以下值(我首先寻找适用于 VBA Excel 的正则表达式,但我认为没有如果正则表达式用于 PCRE,则差异太大):
1- num
之后的数字 --> 3025285000
2- IP 地址 --> 111.111.112.223
和 13.100.1.11
3- 上行链路和下行链路值 --> 139161
和 6269538
4- xTime
之后的日期和时间 --> 2019-07-22 18:09:55 -03:00
输入文字是这样的:
{ num:{3025285000} }
{ ipadd:{iPadd:{iPv4add:{111.111.112.223} } } }
{ ipval:{iPadd:{13.100.1.11} } }
{ :{abc:{-} ddf:{-} mainVALUplink:{139161} mainVALDownlink:{6269538} kppacRR:{bbckdo} xTime:{2019-07-22 18:09:55 -03:00 } ppwo:{-} wwe:{-} iiurur:{qCI:{8} wie:{-} iiwww:{-} oop:{-} } } }
我正在尝试使用以下正则表达式(您可以在此处查看 https://regex101.com/r/J9kGMy/1)
\B\d+\b|\B{\d+\..+\b}|dataVolumeGPRS(Up|Down)link:\B\d+|xTime:{\B\d+
但匹配不完整或字符较多,因为当前匹配为:
匹配 1:完全匹配 8-17 025285000 应该是 3025285000
匹配 2:完整匹配 45-62 {111.111.112.223} 应该是 111.111.112.223
比赛 3:完整比赛 84-97 {13.100.1.11} 应该是 13.100.1.11
匹配4:完整匹配138-143 39161 应该是139161
匹配 5:完全匹配 163-169 269538 应该是 6269538
匹配 6:完整匹配 196-199 019 应该是 2019-07-22 18:09:55 -03:00
第7场:全场比赛201-202 7
第8场:全场204-205 2
第9场:全场207-208 8
第10场:全场210-211 9
第11场:全场213-214 5
第12场:全场217-218 3
第 13 场:全场比赛 220-221 0
第 14 场:完整比赛 305-307 04
由于每个预期结果都占一行,因此合乎逻辑的解决方案是逐行拆分输入,然后对它们应用更简单的单个正则表达式以捕获所需内容。
然而,以下正则表达式虽然冗长,但仍能按预期工作:
num:\s*{\s*(\d+)\s*}[\s\S]+?(?:ip\S+:{\s*([\d\.]+)\s*}[\s\S]+?)[\s\S]+?(?:ip\S+:{\s*([\d\.]+)\s*}[\s\S]+?)[\s\S]+?Uplink:\s*{\s*(\d+)\s*}[\s\S]+?Downlink:\s*{\s*(\d+)}\s*[\s\S]+xTime:{\s*([\s\d-:]*?)\s*}
每个捕获组都包含所需的数据。
在您尝试的模式中,您使用的是 alternation 使用 |
如果您想以这种方式匹配您的值,您可以通过匹配 num
、ipAdd
、iPv4add
或 xTime
使匹配更具体,然后使用捕获组捕获 {
和 }
.
之间的内容
在捕获组 (\d+)
中,您可以使用或使用 negated character class ([^{}]+)
匹配 1+ 个数字,并匹配除 {
和 [=17 之外的所有字符=]
结果将有 4 个捕获组。
num:{(\d+)}|iPadd:{([^{}]+)}|iPv4add:{([^{}]+)}|xTime:{([^{}]+)}
我有以下输入文本,我想用正则表达式提取以下值(我首先寻找适用于 VBA Excel 的正则表达式,但我认为没有如果正则表达式用于 PCRE,则差异太大):
1- num
之后的数字 --> 3025285000
2- IP 地址 --> 111.111.112.223
和 13.100.1.11
3- 上行链路和下行链路值 --> 139161
和 6269538
4- xTime
之后的日期和时间 --> 2019-07-22 18:09:55 -03:00
输入文字是这样的:
{ num:{3025285000} }
{ ipadd:{iPadd:{iPv4add:{111.111.112.223} } } }
{ ipval:{iPadd:{13.100.1.11} } }
{ :{abc:{-} ddf:{-} mainVALUplink:{139161} mainVALDownlink:{6269538} kppacRR:{bbckdo} xTime:{2019-07-22 18:09:55 -03:00 } ppwo:{-} wwe:{-} iiurur:{qCI:{8} wie:{-} iiwww:{-} oop:{-} } } }
我正在尝试使用以下正则表达式(您可以在此处查看 https://regex101.com/r/J9kGMy/1)
\B\d+\b|\B{\d+\..+\b}|dataVolumeGPRS(Up|Down)link:\B\d+|xTime:{\B\d+
但匹配不完整或字符较多,因为当前匹配为:
匹配 1:完全匹配 8-17 025285000 应该是 3025285000
匹配 2:完整匹配 45-62 {111.111.112.223} 应该是 111.111.112.223
比赛 3:完整比赛 84-97 {13.100.1.11} 应该是 13.100.1.11
匹配4:完整匹配138-143 39161 应该是139161
匹配 5:完全匹配 163-169 269538 应该是 6269538
匹配 6:完整匹配 196-199 019 应该是 2019-07-22 18:09:55 -03:00
第7场:全场比赛201-202 7
第8场:全场204-205 2
第9场:全场207-208 8
第10场:全场210-211 9
第11场:全场213-214 5
第12场:全场217-218 3
第 13 场:全场比赛 220-221 0
第 14 场:完整比赛 305-307 04
由于每个预期结果都占一行,因此合乎逻辑的解决方案是逐行拆分输入,然后对它们应用更简单的单个正则表达式以捕获所需内容。
然而,以下正则表达式虽然冗长,但仍能按预期工作:
num:\s*{\s*(\d+)\s*}[\s\S]+?(?:ip\S+:{\s*([\d\.]+)\s*}[\s\S]+?)[\s\S]+?(?:ip\S+:{\s*([\d\.]+)\s*}[\s\S]+?)[\s\S]+?Uplink:\s*{\s*(\d+)\s*}[\s\S]+?Downlink:\s*{\s*(\d+)}\s*[\s\S]+xTime:{\s*([\s\d-:]*?)\s*}
每个捕获组都包含所需的数据。
在您尝试的模式中,您使用的是 alternation 使用 |
如果您想以这种方式匹配您的值,您可以通过匹配 num
、ipAdd
、iPv4add
或 xTime
使匹配更具体,然后使用捕获组捕获 {
和 }
.
在捕获组 (\d+)
中,您可以使用或使用 negated character class ([^{}]+)
匹配 1+ 个数字,并匹配除 {
和 [=17 之外的所有字符=]
结果将有 4 个捕获组。
num:{(\d+)}|iPadd:{([^{}]+)}|iPv4add:{([^{}]+)}|xTime:{([^{}]+)}