使用正则表达式捕获两个组中的一个

3

我很难通过正则表达式弄清楚这是否可能。我有以下字符串(原始字符串更长,是一个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
这个真是太简单了,我居然没想到... - kitensei
2个回答

5
这个应该符合您的需求:
^.*(?:IpAddress(?!":"-)|WorkstationName)":"(?P<ipaddr>[^"]+)

正则表达式可视化

Debuggex 提供可视化功能。

regex101 上查看演示。


我感觉自己太傻了,解决方案其实很简单,可我却没想到!谢谢,这正是我所需要的。 - kitensei

0

您可以使用这个模式:

~^.*"(?:IpAddress":"\K[0-9]{1,3}(?:\.[0-9]{1,3}){3}|WorkstationName":"\K[^"]*)(?=")~m

演示

由于它以.*(贪婪量词)开头,所以交替测试是从行末到行首进行的,并且第一个成功的分支获胜。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接