Domanda

Sto lavorando su un'applicazione che cerca di testo utilizzando espressioni regolari sulla base di input da un utente. Una possibilità che l'utente ha è quello di includere un "Match 0 o più caratteri" jolly con l'asterisco. Ho bisogno di questo per solo match tra i confini di parola. Il mio primo tentativo è stato quello di convertire tutti i asterischi per (?:(?=\B).)*, che funziona bene per la maggior parte dei casi. Qualora questo non è che a quanto pare .Net considera la posizione tra un carattere Unicode con un diacritico e un altro personaggio una parola-break. Considero questo un bug, e hanno presentato al sito commenti e suggerimenti Microsoft .

Nel frattempo, però, ho bisogno di ottenere la funzionalità implementata e del prodotto spedito. Sto considerando usando [\p{L}\p{M}\p{N}\p{Pc}]* come il testo di sostituzione, ma, francamente, sono in "Io non capisco che cosa questo sta per fare" terra. Voglio dire, posso leggere le specifiche, ma non sono sicuro che avrei potuto sufficientemente testare questo per assicurarsi che sta facendo quello che mi aspetto. Io semplicemente non saprei tutte le condizioni al contorno di test. L'applicazione è utilizzata dai lavoratori cross-culturali, molti dei quali si trovano in posizioni tribali, in modo che qualsiasi e tutti i sistemi di scrittura ha bisogno di essere sostenuta, tra cui alcuni che utilizzano larghezza zero interruzioni di parola.

Qualcuno ha una soluzione più elegante, o potrebbe confermare / correggere il codice di cui sopra, o offrire alcune indicazioni?

Grazie per il vostro aiuto.

È stato utile?

Soluzione

L'equivalente di /(?:(?=\B).)*/ in un contesto unicode potrebbe essere:

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

... o un po 'semplificata:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

Questo dovrebbe corrispondere una parola o un non-parola (spaziatura, punteggiatura ecc) sequenza, possibilmente uno vuoto.

Un normale o negata word-confine (\b o \B) è fondamentalmente un doppio sguardo intorno. Uno guardando dietro, rendendo sicuri del tipo di carattere che precede la posizione corrente. Allo stesso modo uno che guarda avanti.

Nella seconda regex, ho rimosso il look-around e utilizzati classi di personaggi semplici, invece.

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