Lookahead positivo de Regex quando os dados de lookahead não existem (PCRE)

4

Estou tentando combinar uma string que terá um formato semelhante ao seguinte:

username=joe password='this! is a password with "quotes" and spaces#913 custom1 customd afd weirdhuh? custom1=myvalue

Para explicar mais detalhadamente, esta é uma lista de variáveis separadas por sinais de igual. As variáveis válidas que podem ser passadas são: nome de usuário, senha e customX (onde X é qualquer número de dígito (s)).

Eu estou tentando especificamente combinar o campo de senha, já que a variável passada pode tecnicamente ter qualquer número de citações, espaços, etc, que são caracteres válidos. Decidi que o melhor "ponto de interrupção" a ser usado para determinar quando a string de senha termina é a existência de uma string "customX=" que infere que a próxima variável está sendo iniciada.

Portanto, no exemplo acima, a senha real seria:

'this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

Cheguei ao seguinte regex:

(?i)password(?-i)=.+?(?= (?i)custom(?-i)\d+=)

Isso parece corresponder ao seguinte:

password='this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

Este é o efeito que eu quero (eu posso facilmente analisar a "senha="), mas o problema é que este regex só parece funcionar se houver uma existência desse final "custom1 = myvalue" no final de a corda. Se isso for removido, não haverá correspondência alguma.

Eu preciso ser capaz de corresponder a string de senha, independentemente de o valor final estar presente ou não.

pontos de bônus, se você pode retirar a "senha=" para acabar com a senha real.

    
por BenH 09.06.2016 / 08:01

1 resposta

2

but the problem is this regex only seems to work if there is an existence of that final "custom1=myvalue"

Você pode adicionar um final opcional de string para corresponder em vez de custom1=myvalue :% (?i)password(?-i)=.+?((?= (?i)custom(?-i)\d+=)|$)

Bonus points if you can strip out the "password=" to end up only with the actual password.

Use lookbehind quando você corresponder a password= :% (?<=(?i)password(?-i)=).+?((?= (?i)custom(?-i)\d+=)|$)

    
por 09.06.2016 / 08:38

Tags