Domanda

Sto usando involucri di byte pettine (http://bytecomb.com/regular-expressions-in-vba/). Sembrano funzionare molto bene. Ho bisogno di aiuto per formulare modelli robusti.

Provo risultati inaspettati quando combino lookahead "(? =)" 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" e "smetti" funzionano come previsto. Per la prossima serie di stringhe di testo input, spero di estrarre "67,89" e per il terzo, ".89". Inizialmente, ho formulato d+.? D*|. D+ per il numero decimale galleggiante per coprire entrambe le situazioni. L'aggiunta di parentesi non ha aiutato. Rimozione del o aiutato per 67,89. Finalmente ho trovato una soluzione funzionante. Ma c'è qualcosa di meglio? Puoi aiutarmi a capire l'ordine di precedenza? Se possibile, vorrei tenere le due parti di o insieme.

Grazie, no-a-programmer!

È stato utile?

Soluzione

\d+\.?\d*|\.\d+(?=\s*ch) Applicato a "Sta.23.5 .1 parole 67,89 ch" cattura prima 23,5 perché corrisponde \d+\.?\d*

O "|" ha la massima precedenza, se vuoi pensarci così, dividendo il modello in due possibili partite: \d+\.?\d* e \.\d+(?=\s*ch)

Se vuoi prevenire \d+\.?d* Dalla corrispondenza 23.5, dovresti aggiungere un criterio extra, come richiedere un carattere spaziale prima di esso e usare la cattura della parentesi per ottenere il numero come sottoposto \s(\d+\.?\d*)

Potresti abbinare entrambi con questo modello, \s(\d+\.?\d*)|\.\d+(?=\s*ch), ma tieni presente che se la prima metà corrispondesse vedresti i sottogruppi per il valore effettivo.

Il vero problema qui è che la classe Regexp di VBScript non supporta lookbehind, basta lookahead.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top