/ / se l'acquisizione regex contiene parentesi, quindi acquisire i contenuti di parentesi catturare il gruppo - regex, regex-group

se l'acquisizione regolare contiene parentesi, quindi acquisisci il contenuto di parentesi acquisisce il gruppo - regex, regex-group

Ho le seguenti linee ...

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

Ho creato una regex

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

Nel gruppo n. 2, come posso modificare la regex per acquisire quanto segue

  • IF Gruppo # 2 Contiene il secondo set di parentesi []
  • ALLORA Cattura il contenuto delle parentesi
  • ELSE Cattura i contenuti del gruppo

E ottieni il risultato:

  • Linea 1: gruppo n. 2: PQ.ACCOUNTS.IN
  • Linea 2: gruppo # 2: default-workqueue-14

risposte:

1 per risposta № 1

Puoi usare gruppi non-catturanti per fare il tuobidding - selezionando prima le parentesi esterne e poi cercando di trovare se ci sono parentesi interne nella selezione e catturare cosa c'è tra di loro, o semplicemente catturare cosa c'è tra le parentesi esterne:

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

Non hai specificato quale lingua usi, ma questo ti restituirà due gruppi - in caso di Line 1 il primo gruppo di cattura conterrà la stringa catturata, in caso di Line 2 il secondo gruppo di cattura conterrà quello che è tra le parentesi, in entrambi i casi verrà popolato solo un gruppo di cattura.