使用正则表达式捕获一个或其他组

时间:2016-02-09 12:33:01

标签: regex

我很难搞清楚这是否可以使用正则表达式。我有以下字符串(原始字符串更长,它是一个json字符串):

... "WorkstationName":"WS-8300E-007","IpAddress":"192.10.10.10" ...

我想抓住 IpAddress ,或者,如果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))

所以,基本上,我这样做:

  • 检查是否遵循“WorkstationName”,某些时候是无效的ip(“ - ”)
  • 如果是,请在 \ 1
  • 中捕获工作站名称
  • 如果 \ 1 组存在,请捕获工作站名称
  • 否则捕获IP地址

我正在使用命名组的困难时期,我已经成功捕获了2组中的所有内容,但我绝对需要根据字符串在同一组中。

我无法使用JSON解析器

2 个答案:

答案 0 :(得分:4)

这个应该符合您的需求:

^.*(?:IpAddress(?!":"-)|WorkstationName)":"(?P<ipaddr>[^"]+)

Regular expression visualization

Debuggex

的可视化

regex101上的演示

答案 1 :(得分:0)

您可以使用此模式:

String

demo

因为它以~^.*"(?:IpAddress":"\K[0-9]{1,3}(?:\.[0-9]{1,3}){3}|WorkstationName":"\K[^"]*)(?=")~m (一个贪婪的量词)开始,所以从行的结尾到开头测试交替,并且第一个成功的分支获胜。