如果正则表达式捕获包含括号,则捕获括号的内容,否则捕获该组

时间:2017-06-09 16:07:13

标签: regex regex-group

我有以下几行......

INFO   | jvm 1    | 2017/04/11 23:59:52 | 2017-04-11 23:59:52:[ - JmsConsumer[PQ.ACCOUNTS.IN]] JMS01 - Accounts Queue ACCTS1  INFO  Msg Detected
INFO   | jvm 1    | 2017/04/11 23:59:52 | 2017-04-11 23:59:52:[          default-workqueue-14] sendSoapTarget                 INFO  RESPONSE: <soap:Envelope 

我创建了一个正则表达式

/(?:.*)(?:\| )(?:.*)(?:\| )(.*)(?:\| )(?:.*)(\:\[.*\[?.*\]?\])(?:\s)(.{30})/g

在组#2中 - 如何修改正则表达式以捕获以下内容

  • IF Group#2包含第二组括号[]
  • 然后捕捉括号内容
  • ELSE捕获小组的内容

得到结果:

  • 第1行:第2组:PQ.ACCOUNTS.IN
  • 第2行:第2组:default-workqueue-14

1 个答案:

答案 0 :(得分:1)

您可以使用非捕获组来进行出价 - 首先选择外部括号,然后尝试查找选择中是否有内部括号并捕获它们之间的内容,或者仅捕获外部括号之间的内容:

(?:\[(?:.*?\[(.*?)\].*?|(.*?))\])

您没有指定您使用的语言,但这将返回两个组 - 如果Line 1,第一个捕获组将包含捕获的字符串,如果Line 2第二个捕获组将包含括号之间的内容。在这两种情况下,只会填充一个捕获组。