Второй набор паренов будет захватывать «DEF», «GHI» и «JKL» соответственно ...
([^-]+-){1}([^-]+)
([^-]+-){2}([^-]+)
([^-]+-){3}([^-]+)
Если это perl, сделать первый набор паренов неперехваченным, т.е.:
# perl -de 0
$_="ABC-DEF-GHI-JKL-MNO"
p /(?:[^-]+-){1}([^-]+)/
DEF
p /(?:[^-]+-){2}([^-]+)/
GHI
p /(?:[^-]+-){3}([^-]+)/
JKL
$_="ABC-DEF01-GHI54677-JKL!9988-MNOP"
p /(?:[^-]+-){1}([^-]+)/
DEF01
p /(?:[^-]+-){2}([^-]+)/
GHI54677
p /(?:[^-]+-){3}([^-]+)/
JKL!9988
Объяснение:
(?: = non-capturing parens
[^-] = a non-dash character
+ = one or more
- = a dash
) = close paren
{3} = repeat 3 times
Эта часть «сожирает» 1, 2, 3 или любое другое число блоков, оставляя следующий набор равнымвозьмите тот, который вы ищете.
Вместо +
вы также можете использовать {1,}
, что означает 1-к-любому-номеру.
Если ваши блоки могут быть нулевымиразмер, так:
ABC - GHI-JKL
И вы хотите найти второе, это "" (пустая строка), затем используйте *
вместо +
.Или вы можете использовать {0,}
, что означает от 0 до любого числа.