2010-03-27 14 views
1

Donc, je suis délibérément resté à l'écart de RegEx car il suffit de regarder cela me tue ... pouah. Mais maintenant j'en ai besoin et je pourrais vraiment utiliser de l'aide pour le faire dans .NET (C# ou VB.NET). J'ai besoin de diviser une chaîne basée sur la capitalisation ou l'absence de celle-ci. Par exemple:RegEx: Chaîne fractionnée en lettres majuscules et lettres non majuscules pour créer des polices de petite capitalisation

Je ne suis pas MAJUSCULES

  1. "I"
  2. "ne suis pas"
  3. "P"
  4. "ercase"

ou

FBI Agent Winters

  1. "FBI A"
  2. "gent"
  3. "W"
  4. "inters"

La raison pour laquelle je Je fais cela est de créer manuellement de petites capitalisations, dans lequel les chaînes non majuscules seront envoyées en majuscules et la taille de la police correspond à 80% de la taille de la police d'origine. Appréciez toute aide qui pourrait être fournie ici.

Répondre

1

Je pense que cette expression régulière devrait travailler /([A-Z ]*)([^A-Z]*)/

Il fait ces divisions sur ces données selon rubular.com

+0

Très bon site, j'ai ajouté un signet pour référence future. J'ai légèrement modifié votre modèle et cela fonctionne comme un charme: '/ ([AZ] +) ([^ AZ] +) /' –

+0

Juste pour le dire, cette RE suppose, bien sûr, qu'aucune entrée en non-latin les scripts sont entrés. Il ignore complètement, par exemple, le grec et le coréen. – Cornelius

2

Me semble que vous avez juste besoin de faire correspondre tout ce qui est pas une lettre majuscule. Par exemple:

input = Regex.Replace(input, @"[^A-Z]+", ToSmallCaps); 

... où ToSmallCaps est un délégué MatchEvaluator qui convertit le texte correspondant aux petites capitalisations, mais il est que vous faites cela. Par exemple:

static string ToSmallCaps(Match m) 
{ 
    return String.Format(@"<span style=""whatever"">{0}</span>", m.Value); 
} 

EDIT: Une version plus conviviale Unicode regex serait @"[^\p{Lu}\p{Lt}]+", qui correspond à l'un ou plusieurs autre chose qu'une lettre majuscule ou titlecase, dans toutes les langues.

+0

Merci Alan. J'ai besoin de faire correspondre à la fois tout ce qui est une ou plusieurs lettres majuscules et un ou plusieurs caractères qui ne sont pas des majuscules. –

2

Bien que la réponse d'Alan résoudra probablement votre problème, par souci d'exhaustivité, je poste une regex qui renvoie les parties majuscules et minuscules comme des correspondances, comme dans votre exemple.

ANSI:

Regex.Matches("I'm not upPercase", @"[^a-z]+|[^A-Z]+"); 

Unicode:

Regex.Matches("I'm not upPercase", @"[^\p{Ll}]+|[^\p{Lu}]+"); 
+0

Merci pour l'ajout Unicode. –

-1

Je pense que cela est peut également être obtenue en utilisant des assertions dans les expressions régulières:

<?php 
$str = 'TestMyFuncCall'; 
var_dump(preg_split('/(?=[A-Z])/', $str, null, PREG_SPLIT_NO_EMPTY)); 

Sortie:

array(4) { 
    [0]=> 
    string(4) "Test" 
    [1]=> 
    string(2) "My" 
    [2]=> 
    string(4) "Func" 
    [3]=> 
    string(4) "Call" 
} 

Je suis désolé pour PHP, pas de Visual Studio à la portée. Mais vous pouvez faire à peu près la même chose. NET je suis sûr.

Questions connexes