Deseja testar se a string 647:all|1bc:all|d1f:all|...
está formatada corretamente e se contém partes correspondentes aos padrões mencionados acima?
Dependendo de como você deseja corresponder exatamente aos nomes de domínio, uma parte disso poderia (em ERE) ser, por exemplo,
[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)
E uma linha completa com várias cópias, |
-separated:
^[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)(\|[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+))*$
Isso permitiria coisas como abcd
ou foo..bar
no nome do domínio, mesmo que elas não sejam realmente nomes totalmente qualificados ou válidos. Para um teste mais rigoroso, a parte do nome de domínio provavelmente deve ser algo assim: [-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?
Provavelmente seria mais adequado dividir essa string primeiro e testar as partes individualmente, em vez de usar um único grande regex.
Algo como isso seria imprimir os elementos que não correspondem ao padrão necessário:
$ perl -lne 'chomp; for $a (split/\|/) {
print "mismatch: $a" if $a !~ /^[[:alnum:]]{3}:(all|[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?)$/;
}' <<< '123:all|456:abcd|789:foo..bar|999:www.host.com'
mismatch: 456:abcd
mismatch: 789:foo..bar