À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, regex
mas 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, regex
mas 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""