2015-10-20 3 views
1

У меня есть следующая строка, которую я хочу разделить с использованием регулярных выражений:Regex - матч до следующего матча в группах

Connect: Unable to open connection to server. HOST:(servernamex) SERVICE:(cnxadaB0) DATABASEINFO:(3 255 C:\DATABASENAME.DAT) ERROR:RemoteConnect: SocketError(10061) The CONNX Listener process (CNXRUN##_MAIN) is not running on the system.

Регулярное выражение я придумал до сих пор выглядит следующим образом:

(\s|^)([A-Z]\w\w+:(?!(\s[A-Z]\w\w+:))) 

Когда я бегу регулярное выражение, я получаю следующий результат:

MATCH 1 
1. '' 
2. 'Connect:' 
MATCH 2 
1. ' ' 
2. 'HOST:' 
MATCH 3 
1. ' ' 
2. 'SERVICE:' 
MATCH 4 
1. ' ' 
2. 'DATABASEINFO:' 
MATCH 5 
1. ' ' 
2. 'ERROR:' 

Я хочу, чтобы разделить его с помощью регулярных выражений, чтобы сгруппировать данные для меня следующим образом:

MATCH 1 
1. '' 
2. 'Connect:' 
3. 'Unable to open connection to server.' 
MATCH 2 
1. ' ' 
2. 'HOST:' 
3. '(servernamex)' 
MATCH 3 
1. ' ' 
2. 'SERVICE:' 
3. '(cnxadaB0)' 
MATCH 4 
1. ' ' 
2. 'DATABASEINFO:' 
3. '(3 255 C:\DATABASENAME.DAT)' 
MATCH 5 
1. ' ' 
2. 'ERROR:' 
3. 'RemoteConnect: SocketError(10061) The CONNX Listener process (CNXRUN##_MAIN) is not running on the system. 

образца с тем, что я играл с: regex101 demo

ответ

1

Вы можете использовать это regex:

(^|\s)([A-Z]\w+:)\s*(.*?(?=\s[A-Z]\w+:|$)) 

RegEx Demo

В случае, если вы хотите, чтобы избежать первого захваченных групп с пространством или пустой строкой, то используйте утверждение: просмотр назад

(?<=^|\s)([A-Z]\w+:)\s*(.*?(?=\s[A-Z]\w+:|$)) 
0
([^: ]+?:(?![^(]*\)))\s*(.*?)(?=\s+[^: ]*:(?![^(]*\))|$) 

Вы можете использовать this.See demo.Instead из split сделать match и захватить groups ,

https://regex101.com/r/gT6vU5/3

Смежные вопросы