Pergunta

Estou usando invólucros de byte pente (http://bytecomb.com/regular-expressions-in-vba/). Eles parecem estar funcionando muito bem. Preciso de ajuda para formular padrões robustos.

Eu experimento resultados inesperados ao combinar o lookahead "(? =)" Com ou "|".

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

"Iraque" e "Quit" funcionam como esperado. Para o próximo conjunto de seqüências de texto de entrada, espero extrair "67,89" e para o terceiro ".89". Inicialmente, formulei d+.? D*|. D+ para número decimal flutuante para cobrir as duas situações. A adição de parênteses não ajudou. Removendo o OR ajudado por 67,89. Finalmente encontrei uma solução de trabalho. Mas há algo melhor? Você pode me ajudar a entender a ordem da precedência? Se possível, gostaria de manter as duas partes do ou juntas.

Obrigado, não um programa!

Foi útil?

Solução

\d+\.?\d*|\.\d+(?=\s*ch) Aplicado ao "Sta.23.5 .1 Palavras 67,89 CH" captura 23.5 primeiro porque corresponde \d+\.?\d*

O ou "|" Tem a maior precedência, se você quiser pensar assim, dividindo o padrão em duas partidas possíveis: \d+\.?\d* e \.\d+(?=\s*ch)

Se você quiser prevenir \d+\.?d* A partir da correspondência 23.5, você precisaria adicionar critérios extras, como exigir um personagem espacial antes dele e usar a captura de parênteses para obter o número como envio: \s(\d+\.?\d*)

Você pode combinar com este padrão, \s(\d+\.?\d*)|\.\d+(?=\s*ch), mas lembre -se de que, se o primeiro tempo corresponder, você estaria olhando para as subtidas para obter o valor real.

O verdadeiro problema aqui é que a classe REGEXP do VBScript não suporta o LookBehind, apenas Lookahead.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top