Come posso scrivere un'espressione regolare che rileva l'utilizzo non corretto di una virgola in una stringa, vale a dire: 1. per non numeri, nessuno spazio prima e 1 spazio dopo; 2. per i numeri, le virgole sono consentite se precedute da 1-3 cifre e seguite da 3 cifre.Uso di espressioni regolari per verificare l'utilizzo della virgola
Alcuni casi di test:
- ciao, mondo
- ciao, mondo => errato
- ciao, mondo => errati
- 1.234 mondi
- 1,23 mondi => errato
- 1.2345 mondi => errato
- ciao, 123 mondi => errato
- ciao, 1234.567 mondi => errati
- ciao, 12,34,567 mondi => errati
- (nuovo test case) ciao 1, 2, e 3 mondi
- (nuovo test case) ciao $ 1.234 mondi
- (banco di prova nuovo) ciao $ 1,2345 mondi => errato
- (nuovo test case) hello "1.234" mondi 012.351.
- (caso nuovo test) hello "1,23" mondi => errati
Così ho pensato che avrei dovuto una regex per catturare parole con sintassi cattiva via (?![\S\D],[\S\D])
(cattura dove c'è un non-spazio/cifra seguita da una virgola da un non-spazio/cifra) e unirsi a essa con un'altra regex per acquisire numeri con sintassi errata, tramite (?!(.?^(?:\d+|\d{1,3}(?:,\d{3}))(?:.\d+)
. Mettendoli insieme mi danno
preg_match_all("/(?![\S\D],[\S\D])|(?!(.*?^(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d+)?$))/",$str,$syntax_result);
.. ma ovviamente non funziona. Come dovrebbe essere fatto?
================ EDIT ================
Grazie alla risposta Casimir et d'Ippolita sotto, ho fatto funzionare! Ho aggiornato la sua risposta per occuparmi di altri casi d'angolo. Idk se la sintassi che ho aggiunto è la più efficiente, ma funziona, per ora. Lo aggiornerò man mano che si presentano più casi d'angolo!
$pattern = <<<'LOD'
~
(?: # this group contains allowed commas
[\w\)]+,((?=[ ][\w\s\(\"]+)|(?=[\s]+)) # comma between words or line break
|
(?<=^|[^\PP,]|[£$\s]) [0-9]{1,3}(?:,[0-9]{3})* (?=[€\s]|[^\PP,]|$) # thousands separator
) (*SKIP) (*FAIL) # make the pattern fail and forbid backtracking
| , # other commas
~mx
LOD;
Posso chiederti perché stai cercando di farlo? –
Una possibile applicazione pratica: un paragrafo del testo viene estratto da un software OCR e voglio assicurarmi che la sintassi sia corretta prima di memorizzare il testo, usando questa applicazione come uno dei controlli grammaticali. (Nel mio caso il "software OCR" è un appaltatore economico di un paese non di lingua inglese che sta digitando il testo da un file pdf copiato) – Alex