2014-11-21 4 views
0

Я не знаю, как поймать необязательный шаблон в строке.Regex необязательный рекурсивный шаблон

Чтобы разобрать эту строку: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P)

Я использую этот шаблон, который именно то, что мне нужно):

/^([^\/\s]*)\/([^\s]*)(\s\(([^()]*|\([^()]*\)*)\))?/ 

# returns 
# 1. Dalvik 
# 2. 1.6.0 
# 3. (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) 
# 4. Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P 

Но эта строка может иметь первую скороговорку несколько раз, как: Bonobo/1.0.3; Multipass/1.5.2; Dalvik/1.6.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P)

И я бы хотел получить:

# 1. Bonobo 
# 3. 1.0.3 
# 4. Multipass 
# 5. 1.5.2 
# 6. Dalvik 
# 7. 1.6.0 
# 8. (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) 
# 9. Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P 

Но после многих попыток, я не могу понять это.

Любая идея?

Большое спасибо.

+2

Какой язык вы используете? –

ответ

0

Для повторных строк необходимо использовать якорь \G (то есть строки, которые соответствуют одному и тому же шаблону).

\G\s*([^\/\s]*)\/([^\s;]*);?(\s\(([^()]*|\([^()]*\)*)\))? 

DEMO

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