Regular Expression - Onde string contém 'bar' mas não é precedida por 'foo'

2

Atualmente, tenho uma expressão regular para corresponder onde uma string contém 'bar', mas não é precedida por 'foo':

(?<!foo)bar

Desejo modificar o regex para corresponder onde uma string contém 'bar', mas não é precedida por 'foo' e (opcionalmente) nenhum caractere adicional.

'footestbar' não deve corresponder como bar é precedido por 'foo' seguido por 'test'.

Não consigo encontrar uma maneira de conseguir isso, pois as expressões regulares não permitem o uso de um quantificador dentro de um aspecto negativo. Posteriormente não posso fazer o seguinte:

(?<!foo.*)bar

Existe uma abordagem alternativa?

UPDATE:
O sabor da expressão regular é re2 . No momento, estou revisando a documentação, mas à primeira vista, observei o seguinte:

(?<!re)     after text not matching re (NOT SUPPORTED)

Portanto, a solução não pode usar um lookbehind negativo (se eu estiver interpretando a documentação corretamente).

    
por Fitzroy 01.02.2016 / 11:24

1 resposta

2

Post alterado

Assim, parece que alguns (mais?) motores Regex só funcionam com um lookbehind de comprimento fixo. No entanto, eles parecem bem para aceitar um lookahead de comprimento variável. Não tenho certeza de qual é o seu caso de uso ou de como seria viável, mas uma ideia poderia ser reverter sua string e usar:

rab(?!.*oof)

Claro,pareceridículo,eeunãoseicomovocêestáusandoouquãoútilserá.AmaiorpartedaminhaexperiênciacomoRegextemusadoo.NETe,namaioriadasvezes,nãoénecessáriolookbehinds.Apenasumaideiaparavocê..!

OriginalPost-SófuncionacomdeterminadosmecanismosRegex(testadosusandoo.NET)

Experimenteoseguinteregex:

(?<!foo(?:.*)?)bar

Issoadicionaumgrupoopcionaldenãocapturadentrodamesmaaparêncianegativaportrás.

    
por 01.02.2016 / 11:30

Tags