Regex lookahead e lookbehind

Às vezes, precisamos verificar se uma string corresponde ou contém um determinado padrão e é para isso que servem as expressões regulares (regex) .
Mas às vezes temos a condição de que esse padrão seja precedido ou seguido por outro determinado padrão.
Certamente podemos fazer isso tão fácil quanto adicionar este outro padrão ao que estamos procurando

Padrão procurado: [0-9]*
Precedido por: [a-z]
Junção e lucro:[a-z][0-9]*

Mas o que acontece se precisarmos que esta condição seja correspondida, mas queremos obter a corda que corresponda ao padrão sem o padrão de condicionamento

a = "k47"

# match all numbers preceded by a letter
a
.match(/[a-z][0-9]*/)[0]

# but we just want the number :(
> "k47"

Apresentando regex lookahead e lookbehind


olhe para frente

(?=regex)

Significado: seguido pela expressão, regexmas sem incluí-la na correspondência

ej.

um yolo seguido por um lo, mas sem incluí-lo na partida

http://rubular.com/?regex=yolo(?=lo)&test=yolo%20yololo

entrada: yolo yololo

regex: yolo(?=lo)

resultado: yolo yolo lo


(?!regex)

Significado: não seguido pela expressãoregex

ej.

um yolo não seguido por um lo

http://rubular.com/?regex=yolo(?!lo)&test=yolo%20yololo

entrada: yolo yololo

regex: yolo (?! lo)

resultado: yolo yololo


olhar para trás

(?<=regex)

Significado: precedido pela expressão, regexmas sem incluí-la na correspondência

ej.

um lol precedido por um yo, mas sem incluí-lo na partida

http://rubular.com/?regex=(?%3C=yo)lol&test=lol%20yololo

entrada: lol yololo

regex: (? <= yo) lol

Resultado: lol yo lol o


(?<!regex)

Significado: não precedido pela expressãoregex

ej.

um lol não precedido por um yo

http://rubular.com/?regex=(?%3C!yo)lol&test=lol%20yololo

entrada: lol yololo

regex: (? <! yo) lol

resultado: lol yololo


Exemplo Ruby

a.gsub(/(?<=:)[0-9]+/, '""')

Cerque qualquer número precedido por um :entre"

a = "{a:123,c:12345}"

a
.gsub(/(?<=:)[0-9]+/, '""')

> "{a:"123""