我很难通过正则表达式弄清楚这是否可能。我有以下字符串(原始字符串更长,是一个json字符串):
... "WorkstationName":"WS-8300E-007","IpAddress":"192.10.10.10" ...
我希望能够获取IpAddress,如果不存在,则获取WorkstationName
# IPADDR = 192.10.10.10
... "WorkstationName":"WS-8300E-007","IpAddress":"192.10.10.10" ...
# IPADDR = WS-8300E-007
... "WorkstationName":"WS-8300E-007","IpAddress":"-" ...
我尝试了几种模式:
- 条件前瞻
- 捕获后向引用
- 其他我忘记的尝试
但是都没有成功,我需要在一个命名组(?P<ipaddr>)
中捕获模式,以便输出可以被其他软件处理。
我最终使用的正则表达式是:
(?:("WorkstationName":)(?=.*IpAddress":"-"))?(?(1)(?:"([^"]+)")?|.*IpAddress":"([^"]+")?)(?P<ipaddr>(?(2)\2|\3))
那么,基本上我要做的是:
- 检查是否在某个时刻跟着一个无效的ip(“-”)后面有“WorkstationName”
- 如果是,则在\1中捕获工作站名称
- 如果组 \1 存在,则捕获工作站名称
- 否则捕获IP地址
我遇到的难点是使用命名组,我已经成功地在2个组中捕获了所有内容,但我绝对需要根据字符串在同一组中。
我无法使用JSON解析器。
(IpAddress|WorkstationName)
? - Oleg V. Volkov