La méthode .NET pour convertir une chaîne en cas de phrase

je cherche une fonction pour convertir une chaîne de texte qui est en majuscule à SentenceCase. Tous les exemples que je trouve transforment le texte en TitleCase.

cas de Sentence dans un sens général décrit la façon dont la capitalisation est utilisé dans une phrase. Phrase cas décrit également la norme majuscule d'une phrase en anglais, c'est à dire la première lettre de la phrase est capitalisé, le reste étant les minuscules (à moins exigeant la capitalisation pour une raison spécifique, par exemple, noms propres, Acronymes, etc.).

quelqu'un Peut-il m'indiquer la direction d'un script ou une fonction pour SentenceCase?

21
demandé sur CrazyTim 2010-06-29 18:04:44

8 réponses

il n'y a rien de intégré dans .NET - cependant, c'est l'un de ces cas où le traitement d'expression régulier peut réellement bien fonctionner. Je commencerais par Convertir la chaîne entière en minuscules, et ensuite, en première approximation, vous pourriez utiliser regex pour trouver toutes les séquences comme [a-z]\.\s+(.), et utiliser ToUpper() pour convertir le groupe capturé en majuscules. RegEx la classe est surchargée Replace() méthode qui accepte un MatchEvaluator delegate, qui vous permet de définir comment remplacer la correspondance de la valeur.

Voici un exemple de code de ce genre:

var sourcestring = "THIS IS A GROUP. OF CAPITALIZED. LETTERS.";
// start by converting entire string to lower case
var lowerCase = sourcestring.ToLower();
// matches the first sentence of a string, as well as subsequent sentences
var r = new Regex(@"(^[a-z])|\.\s+(.)", RegexOptions.ExplicitCapture);
// MatchEvaluator delegate defines replacement of setence starts to uppercase
var result = r.Replace(lowerCase, s => s.Value.ToUpper());

// result is: "This is a group. Of uncapitalized. Letters."

cela pourrait être affiné de différentes façons pour mieux correspondre à une plus grande variété de modèles de phrases (pas seulement ceux qui se terminent par une lettre+période).

30
répondu LBushkin 2010-06-29 14:35:44

Cela fonctionne pour moi.

/// <summary>
/// Converts a string to sentence case.
/// </summary>
/// <param name="input">The string to convert.</param>
/// <returns>A string</returns>
public static string SentenceCase(string input)
{
    if (input.Length < 1)
        return input;

    string sentence = input.ToLower();
    return sentence[0].ToString().ToUpper() +
       sentence.Substring(1);
}
4
répondu Ed B 2010-06-29 14:11:47

il y a une fonction ToTitleCase intégrée qui sera étendue pour supporter plusieurs cultures à l'avenir.

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

3
répondu Sanya Rajan 2013-04-04 11:23:42

j'ai trouvé ce exemple sur MSDN.

2
répondu devio 2010-06-29 14:13:13

si votre chaîne de caractères n'est pas une phrase, mais de nombreuses phrases, cela devient un problème très difficile.

expressions Régulières se révélera un outil précieux, mais (1), vous aurez à les connaître assez bien pour être efficace, et (2) ils ont peut-être pas jusqu'à faire le travail tout seul.

réfléchir à cette phrase

"Qui est le 1er," M. Smith, qui n'était pas rire -- répondu.

Cette phrase ne commence pas par un lettre, elle a un chiffre, une ponctuation différente, un nom propre, et un . dans le milieu.

Les difficultés sont énormes, et c'est une phrase.

Une des choses les plus importantes lors de l'utilisation de RegEx est de "connaître vos données."Si vous connaissez l'ampleur des types de phrases que vous allez traiter, votre tâche sera plus facile à gérer.

dans tous les cas, vous devrez jouer avec votre implémentation jusqu'à ce que vous soyez satisfait de vos résultats. Je suggère l'écriture quelques tests automatisés avec quelques exemples de saisie -- pendant que vous travaillez sur votre mise en œuvre, vous pouvez exécuter les tests régulièrement pour voir où vous vous approchez et où vous manquez encore la marque.

2
répondu Jay 2010-06-29 14:42:33

si vous souhaitez cas de phrase une chaîne contenant de la ponctuation autre que de simples périodes:

string input = "THIS IS YELLING! WHY ARE WE YELLING? BECAUSE WE CAN. THAT IS ALL.";
var sentenceRegex = new Regex(@"(^[a-z])|[?!.:,;]\s+(.)", RegexOptions.ExplicitCapture);
input = sentenceRegex.Replace(input.ToLower(), s => s.Value.ToUpper());
2
répondu Matt Martin 2014-10-16 19:02:42

C'est ce que j'utilise (VB.NET). Il fonctionne en plus les situations, y compris:

  • plusieurs phrases
  • phrases commençant et se terminant par des espaces
  • phrases commençant par les caractères autres que A-Z. Par exemple, il fonctionnera pour: "si vous voulez de 100,00 $alors demandez-moi".

    <Extension()>
    Public Function ToSentanceCase(ByVal s As String) As String
        ' Written by Jason. Inspired from: http://www.access-programmers.co.uk/forums/showthread.php?t=147680
    
        Dim SplitSentence() As String = s.Split(".")
    
        For i = 0 To SplitSentence.Count - 1
            Dim st = SplitSentence(i)
    
            If st.Trim = "" Or st.Trim.Count = 1 Then Continue For ' ignore empty sentences or sentences with only 1 character.
    
            ' skip past characters that are not A-Z, 0-9 (ASCII) at start of sentence.
            Dim y As Integer = 1
            Do Until y > st.Count
                If (Asc(Mid(st, y, 1)) >= 65 And Asc(Mid(st, y, 1)) <= 90) Or _
                      (Asc(Mid(st, y, 1)) >= 97 And Asc(Mid(st, y, 1)) <= 122) Or _
                     (Asc(Mid(st, y, 1)) >= 48 And Asc(Mid(st, y, 1)) <= 57) Then
                    GoTo Process
                Else
                    Dim w = Asc(Mid(st, y, 1))
                    y += 1
                End If
            Loop
            Continue For
    
    Process:
            Dim sStart As String = ""
            If y > 1 Then sStart = Left(st, 0 + (y - 1))
    
            Dim sMid As String = UCase(st(y - 1)) ' capitalise the first non-space character in sentence.
    
            Dim sEnd As String = Mid(st, y + 1, st.Length)
    
            SplitSentence(i) = sStart & sMid & sEnd
    
        Next
    
        ' rejoin sentances back together:
        Dim concat As String = ""
        For Each st As String In SplitSentence
            concat &= st & "."
        Next
    
        concat = concat.TrimEnd(1)
    
        Return concat
    
    End Function
    

mais en ce qui concerne les noms et acronymes appropriés, Eh bien... il y aura toujours des situations en anglais où la ponctuation n'est pas aussi simple. Par exemple, ce script ne détectera pas une ellipse ("..."), ou abréviations (par exemple: "MR.Jones lived on Magnolia Blvd. près de la maison de Chris").

pour résoudre le problème complètement, vous aurez besoin de produire un dictionnaire de toutes les abréviations/ponctuations possibles pour la langue, et garder le dictionnaire à jour! Après avoir considéré cela, la plupart seront heureux avec un compromis, sinon il suffit D'utiliser Microsoft Word.

1
répondu CrazyTim 2012-05-15 07:12:46
public string GetSentenceCase(string ReqdString) {
    string StrInSentCase = "";
    for (int j = 0; j < ReqdString.Length; j++) {
        if (j == 0) {
           StrInSentCase = ReqdString.ToString().Substring(j, 1).ToUpper();
        }
        else {
            StrInSentCase = StrInSentCase + ReqdString.ToString().Substring(j, 1).ToLower();
        }
    }
    return StrInSentCase.ToString();
}
-1
répondu Kabindra Prasad Sarma 2016-09-14 09:13:50