testa algumas opções separadas por “|”

0

Eu tenho uma string construída com várias opções: valor separado por |

a opção: value pode ser uma das duas:

[[:alnum:]]{3}:all

[[:alnum:]]{3}:FQDN

onde o FQDN é o nome DNS de um host

por exemplo:

647:all|1bc:all|d1f:all|vf4:www.host.com|vk4:all|k22:www.another.com|bbd:all|opo:all

como construir a regex testando essa string de acordo com a regra?

    
por DonJ 19.01.2018 / 10:24

2 respostas

0

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
    
por 19.01.2018 / 10:38
0

O pipeline de dois estágios a seguir imprimirá todas as partes da sequência que não atendem aos critérios da pergunta:

tr '|' '\n'| sed -r -n '/^[[:alnum:]]{3}:[[:alnum:].]{1,}$/!p'

Isso usa uma expressão muito frouxa / permissiva para o FQDN: [[:alnum:]._-]{1,} , ou seja, qualquer conjunto de alfanuméricos junto com . , _ e - (isso significa que o FQDN --- é "válido" ).

O pipeline divide a string em várias linhas no delimitador | e a expressão sed imprime qualquer linha que não corresponda à expressão regular fornecida ( !p , "imprimir se não corresponder"). / p>     

por 19.01.2018 / 11:49