Já faz alguns dias que estou tentando resolver esse problema, mas não consigo fazer funcionar. Analisei muitas perguntas aqui no Stack-overflow, mas ainda não consigo descobrir a maneira correta de resolvê-las.
Eu tenho uma string que representa expressões aritméticas com números e variáveis de "várias palavras", como (Car speed / Road-congestion Time) + 100
e preciso combinar tudo, menos +-*/()
.
Preciso obter as três correspondências a seguir:
- Velocidade do carro
- Tempo de congestionamento rodoviário
- 100
O seguinte tipo de expressão funciona (adiciona uma correspondência vazia extra no final) [+-\\*\\/()]?([^+-\\*\\/()]*)[+-\\*\\/()]?
para string sem hífens nas variáveis de "várias palavras". Para distinguir sinais de menos e hífens, os sinais de menos estão sempre cercados por espaços, mas não consigo descobrir como especificar isso no regexp.
Alguma idéia de como atualizar meu regexp para caber em todos os casos? Além disso, o regexp deve ignorar os números (obter apenas as duas primeiras correspondências no exemplo acima).
PS - A divisão é a última opção e se possível gostaria de usar uma expressão regular.
Você pode tentar algo assim:
Este é o resultado em https://regex101.com/ :
Neste padrão:
\b
afirma um limite de palavra para garantir que estamos combinando palavras inteiras.(?: ... )
é um grupo sem captura para corresponder avariáveis ou números com várias palavras.
[a-zA-Z][-a-zA-Z0-9_ ]*
corresponde a variáveis com várias palavras. Começa com uma letra e pode conter letras, números, hifens, sublinhados e espaços.|
é o operador de alternância, permitindo que o padrão corresponda avariáveis ou números com várias palavras.
\d+
corresponde a um ou mais dígitos para números.