2017-04-11 11 views
1

Je voudrais saisir les 4 premiers caractères de deux mots en utilisant RegEx. J'ai une expérience de RegEx mais une recherche n'a donné aucun résultat.Prenez les 4 premiers caractères de deux mots RegEx

Donc, si je Awesome Sauce je voudrais le résultat final soit AwesSauc

+3

Avez-vous besoin d'utiliser Regex? Cela pourrait être fait dans une ligne de Linq: 'String.Join (" ", input.Split (null, StringSplitOptions.RemoveEmptyEntries) .Sélectionnez (w => w.Substring (0, Math.Min (4, w.Length)) ». – Dai

+0

@Dai Juste parce que OP a * une certaine expérience RegEx * – niksofteng

+0

J'utilise Nintex pour terminer l'opération, donc je suis lié par RegEx – JeremyA1

Répondre

2

Utilisez le Remplacer le texte action avec les paramètres suivants:

Motif: \W*\b(\p{L}{1,4})\w*\W*
texte de remplacement: $1

Voir la regex demo.

détails Pattern:

  • \W* - 0+ CHARS non mot (garniture de la gauche)
  • \b - une limite de premier plan mot
  • (\p{L}{1,4}) - Groupe 1 (appelé ci-via $1 backreference) correspondant à 1 à 4 lettres (y compris les caractères Unicode)
  • \w* - tout caractère 0+ mot (pour faire correspondre le reste du mot)
  • \W* - 0+ caractères non-mot (rognage à partir de la droite)
0

une approche avec Linq

var res = new string(input.Split().SelectMany((x => x.Where((y, i) => i < 4))).ToArray()); 
0

utilisant l'expression rationnelle serait en fait plus complexe et totalement inutile dans ce cas. Faites-le simplement comme ci-dessous.

var sentence = "Awesome  Sau"; 

// With LINQ 
var linqWay = string.Join("", sentence.Split(" ".ToCharArray(), options:StringSplitOptions.RemoveEmptyEntries).Select(x => x.Substring(0, Math.Min(4,x.Length))).ToArray()); 

// Without LINQ 
var oldWay = new StringBuilder(); 
string[] words = sentence.Split(" ".ToCharArray(), options:StringSplitOptions.RemoveEmptyEntries); 
foreach(var word in words) { 
    oldWay.Append(word.Substring(0, Math.Min(4, word.Length))); 
} 

Modifier:

code mis à jour en fonction de @ commentaire de Dai. Math.Min chèque emprunté comme il est de sa suggestion.

+3

Ce code se bloquera si un mot de la chaîne d'entrée est plus court que 4 caractères. Il ne gère pas non plus plusieurs caractères espaces blancs contigus - ou gère les espaces non-espace. – Dai

+0

@Dai - Grande prise. Merci beaucoup. Voir éditer. Semble OP est limité à Regex. – niksofteng

+0

Je suggère d'utiliser '.Split (null, StringSplitOptions.RemoveEmptyEntries)' car cela se divise sur tous les caractères d'espaces, pas seulement sur les espaces. – Dai

1

Je pense que ce RegEx devrait faire le travail

 string pattern = @"\b\w{4}"; 
     var text = "The quick brown fox jumps over the lazy dog"; 

     Regex regex = new Regex(pattern); 
     var match = regex.Match(text); 
     while (match.Captures.Count != 0) 
     { 
      foreach (var capture in match.Captures) 
      { 
       Console.WriteLine(capture); 
      } 
      match = match.NextMatch(); 
     } 

     // outputs: 
     // quic 
     // brow 
     // jump 
     // over 
     // lazy 

Sinon, vous pouvez utiliser des modèles comme:

 \b\w{1,4} => The, quic, brow, fox, jump, over, the, lazy, dog 
     \b[\w|\d]{1,4} => would also match digits 

Mise à jour: ajouté un exemple complet pour C# et modifié le modèle légèrement. Également ajouté quelques modèles alternatifs.

+0

Il correspond 'Awes' et' Sauc' comme prévu. Je pensais juste le commentaire de @ Dai sur la longueur des mots <4 sur ma réponse s'applique même ici. – niksofteng

+0

Si elle doit capturer aussi <4 caractères ET caractères numériques que @G Ravinders réponse serait une solution appropriée. – MiGro

+0

'\ w' correspond déjà aux chiffres, dans .NET regex,' \ w' = '[\ p {L} \ p {N} _]'. –

0

Essayez cette expression

\b[a-zA-Z0-9]{1,4}