Pregunta

Estoy usando envoltorios de byte peine (http://bytecomb.com/regular-expressions-in-vba/). Parecen estar funcionando muy bien. Necesito ayuda para formular patrones robustos.

Experimento resultados inesperados al combinar lookhead "(? =)" Con o "|".

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

"Iraq" y "renuncian" como se esperaba. Para el siguiente conjunto de cadenas de texto de entrada, espero extraer "67.89", y para el tercero, ".89". Inicialmente, formulé d+.? D*|. D+ para el número decimal flotante para cubrir ambas situaciones. Agregar paréntesis no ayudó. Eliminar el OR Ayudó para 67.89. Finalmente encontré una solución de trabajo. ¿Pero hay algo mejor? ¿Puedes ayudarme a entender el orden de precedencia? Si es posible, me gustaría mantener las dos partes del o juntas.

¡Gracias, no es un programa!

¿Fue útil?

Solución

\d+\.?\d*|\.\d+(?=\s*ch) aplicado a "Sta.23.5 .1 Palabras 67.89 CH" captura 23.5 primero porque coincide \d+\.?\d*

El o "|" tiene la mayor precedencia, si quieres pensar en ello, dividiendo el patrón en dos posibles partidos: \d+\.?\d* y \.\d+(?=\s*ch)

Si quieres prevenir \d+\.?d* Desde que coinciden 23.5, tendría que agregar un criterio adicional, como requerir un personaje espacial antes y usar la captura de paréntesis para obtener el número como un submatch: \s(\d+\.?\d*)

Podrías coincidir con este patrón, \s(\d+\.?\d*)|\.\d+(?=\s*ch), pero tenga en cuenta que si la primera mitad coincide, estaría mirando los submatches para el valor real.

El verdadero problema aquí es que la clase Regexp de VBScript no es compatible con lookbehind, solo lookhead.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top