Tenho uma string regex para capturar todos os tipos de números, mas percebi que ela também captura números que vêm imediatamente depois do texto.
Por exemplo, usando uma frase de teste como: O bloco de Nylon-12 era 1,23 por 4E-56 por -7,89 Eu gostaria de extrair 1,23, 4E-56 e -7,89 . Também parece estar pegando o -12 do Nylon-12.
Bastante novo na sintaxe regex, como devo começar minha expressão para garantir que ela não esteja pegando o número de uma palavra. Se houver um espaço entre quaisquer caracteres de texto e caracteres numéricos, tudo bem, mas quando não há espaço como em Nylon-12, não quero capturá-los.
Minha expressão regex que criei para capturar números é fornecida aqui:
[+\-]?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?(?:0|[1-9]\d*)(?:\.\d+)?)?
onde usar regexper se parece com isto:
EDITAR:
Isso parece ser um problema relacionado à busca do operador +/-. Tentei colocar um \b no início e ver os resultados.
Se eu inserir Nylon12 , Nylon-13 ou Nylon+14 na expressão regular, ele retornará -13 e +14 , não 12.
Você pode usar a chamada "afirmação positiva de olhar para trás" para conseguir isso.
Em princípio, você deseja corresponder números que são precedidos por algum espaço em branco ou que estão no início da string.
Na maioria dos dialetos regex, você pode usar esta sintaxe:
Asserções lookbehind são um pouco confusas porque elas não correspondem diretamente aos caracteres na saída. Em vez disso, elas afirmam que os caracteres antes da sua correspondência devem corresponder a algum padrão. Existem versões positivas e negativas (significando que o texto anterior deve corresponder ou não). E existem versões lookbehind e lookahead (significando que o texto antes ou depois da sua correspondência deve ser verificado.)
Este artigo faz um bom trabalho ao explicá-los.
Aqui está sua mesma expressão com a afirmação adicionada:
O padrão lookbehind que usei é
^|\s
o que significa que a correspondência deve ser precedida pelo início da entrada (^
) ou qualquer espaço em branco (\s
). Seu exemplo não mostra isso, mas presumo que em um caso como este:O
37
deve ser retornado também. A^
parte lida com isso, já que não é tecnicamente precedido por espaço em branco.