10
votes

Regex pour correspondre. (Périodes marquant la fin des phrases) mais pas de M. (comme dans M. Hopkins)

J'essaie d'analyser un fichier texte dans des phrases se terminant par des périodes, mais des noms tels que M. Hopkins jettent de fausses alarmes sur la correspondance pour des périodes.

Quelle regex identifie "". mais pas "Mr."

Pour bonus, j'utilise aussi! Pour trouver la fin des phrases, mon regex actuel est /(!/./ et j'aimerais aussi une réponse qui incorpore mes!


2 commentaires

Qu'en est-il des autres abréviations (par exemple, «Mme»), acronymes ponctués ("a.c.m.e."), ou ellipses ("...")?


Si quelqu'un sait comment faire M. qui serait me faire sauter devant.


4 Réponses :


6
votes

Cela ne peut pas être fait avec un mécanisme simple. Il est désespérément ambigu. Les phrases peuvent se terminer par des abréviations et, dans ces cas, elles ne sont pas écrites avec deux périodes.

voir Unicode TR29 . Voir également la bibliothèque Open Source ICU, qui comprend une implémentation de base.


0 commentaires

1
votes

Vos phrases sont toujours suivies de deux espaces? Si oui, vous pourriez simplement vérifier cela ...

/ \. \ s {2} /

et incorporant une autre fin de la ponctuation de la phrase: / [\. \! \?] \ s {2} /

Vous pouvez également vérifier d'autres choses qui pourraient être des indicateurs de la fin d'une phrase, comme si le mot suivant est capitalisé, est-il suivi d'un retour de chariot, etc. Mais au mieux, vous pourrez simplement faire un Devineuse éduquée, comme indiqué au-dessus de la période est trop ambiguë.


0 commentaires

13
votes

Utilisez look négatif derrière .

<?
   $str = "This is Mr. Someone and Mrs. Somebody. They are here to meet Dr. SomeoneElse.";
   $str = preg_replace("/(?<!Mr|Mrs|Dr|Ms)\\./", "\n", $str);
   echo($str);
?>
//outputs:
This is Mr. Someone and Mrs. Somebody
 They are here to meet Dr. SomeoneElse


3 commentaires

Je savais quelqu'un qui vivait sur Lincoln Dr. J'ai vécu sur Albert Rd.


Ok, je me plains trop parce que ce problème est résoluble pour M. STI, seuls le Dr Miss n'a aucune période et Mme et Mme Work.


Est-ce possible sans regarder négatif? Mon application Web ne fonctionne pas car iOS Safari ne prend pas en charge Regex Latherbehind.



0
votes

Le regex (? Fonctionne presque après avoir été testé, mais cela laisse tristement la lettre majuscule dans le match pervin. Une solution pour cela prendrait cette lettre et le retirerait de la correspondance précédente tout en le ajoutant au match lui-même.

Exemple: P>

            //make sure there is a split
            if (lines.Length > 1)
            {
                for (int i = 0; i < lines.Length; i++)
                {
                    //store letter
                    char misplacedLetter = lines[i].TrimEnd().Last();

                    //remove letter
                    lines[i] = lines[i].Substring(0,lines[i].Length-1);

                    //place on front of next sentence.
                    lines[i + 1] = misplacedLetter + lines[i + 1];
                }
            }


0 commentaires