2013-04-06 11 views
11

Sono un reboxp noob e sto provando a dividere i paragrafi in frasi. Nel mio linguaggio usiamo un bel po 'di abbreviazioni (come: bl.a.) nel mezzo delle frasi, quindi sono giunto alla conclusione che quello che devo fare è cercare segni di punteggiatura, che sono seguiti da un singolo spazio e quindi una parola che inizia con una lettera maiuscola come:Divisione di paragrafi in frasi con regexp e PHP

[sentence1]...anymore. However...[sentence2] 

Così un paragrafo come:

Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang. Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

dovrebbe finire in questo output:

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang. 
[1] => Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

e non questo:

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. 
[1] => i forbindelse med afskedigelser af større omfang. 
[2] => Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

ho trovato una soluzione che fa la prima parte di questo con la funzione lookbehind positivo:

$regexp = (?<=[.!?] | [.!?][\'"]); 

e poi

$sentences = preg_split($regexp, $paragraph, -1, PREG_SPLIT_NO_EMPTY); 

che è un punto di partenza, ma spaccature Troppe volte a causa delle molte abbreviazioni.

Ho provato a fare questo:

(?<=[.!?]\s[A-Z] | [.!?][\'"]) 

al bersaglio ogni occorrenza di una

. or ! or ? 

seguito da uno spazio e una lettera maiuscola, ma che non ha funzionato.

Qualcuno sa, se c'è un modo per realizzare ciò che sto cercando di fare?

+0

Così si vuole creare una nuova linea rompere ogni volta che il criterio di 'Questo. È'? –

+0

Non necessariamente, sono abbastanza soddisfatto del formato di output della funzione PHP preg_split. Quello con il quale faccio fatica è scrivere la regexp che cerca il "This". E 'un criterio. – acrmuui

+0

Ciao, grazie per aver risposto. Ho effettivamente letto quelle risposte esatte prima di postare, ma non sono riuscito a trovare nessuno di loro, che cerca il modello esatto di una punteggiatura seguito da uno spazio seguito da una parola che inizia con una lettera maiuscola. O mi sta sfuggendo qualcosa? – acrmuui

risposta

12

Unicode RegExp per frasi splitting: (?<=[.?!;])\s+(?=\p{Lu})

spiegato demo qui: http://regex101.com/r/iR7cC8

+0

Grazie funziona molto – acrmuui

+0

"Unicode" qui è fuorviante.Questa espressione regolare fa uso di Unicode Character Properties, ma questo ** non ** implementa le regole del limite di frase Unicode come definito da UAX 29. – NikiC

+0

@NikiC non è infallibile, ma anche UAX29 anche note: * ... le implementazioni sono libere di sovrascrivere (personalizzare) i risultati per soddisfare i requisiti ... * –

3

Ricerca di un tale modello sembra ancora poco affidabile, ma come frasi possono essere concluse dal ritorno della linea vorrei provare solo quanto segue

[.\!\?][\s\n\r\t][A-Z] 

non credo che in realtà significava per il look-ahead di vero? (!? Insieme, in modo da utilizzare il \ sfugge - dice l'espressione regolare ignora qualsiasi significato speciale)

+0

@ka In teoria contiene entrambi, in pratica ho trovato risultati diversi usando differenti versioni/metodi java/php –