Générer toutes les correspondances pour regex

Pour une sélection d’utilisateur, je voudrais fournir une liste de nombres correspondant à une expression rationnelle donnée. La regex elle-même est très simple elle ne peut ressembler à ceci 123 [0-9] [0-9] ou [4-9] 34.2

J’ai découvert que Fare ( https://github.com/moodmosaic/Fare ) fait le travail en quelque sorte. voir l’exemple suivant:

ssortingng pattern = "123[0-9][0-9]"; var xeger = new Xeger(pattern); var match = xeger.Generate(); //match is eg "12349" 

Malheureusement, Fare-lib ne me donne qu’une seule correspondance possible, mais pas toutes les 100 combinaisons possibles d’une chaîne.

Si vous pensez que regex n’est pas une bonne idée dans ce cas et suggère plutôt une implémentation à boucle forl qui remplace les caractères, je vais aussi avec mais je ne sais pas comment faire? Peut-être qu’une fonction récursive serait intelligente?

Je préfère créer ma propre implémentation que d’utiliser une bibliothèque. Le code suivant fait ce que vous voulez réaliser.

  private static Regex regexRegex = new Regex("\\[(?\\d)-(?\\d)]", RegexOptions.Comstackd); private static IEnumerable GetSsortingngsForRegex(ssortingng pattern) { var ssortingngs = Enumerable.Repeat("", 1); var lastIndex = 0; foreach (Match m in regexRegex.Matches(pattern)) { if (m.Index > lastIndex) { var capturedLastIndex = lastIndex; ssortingngs = ssortingngs.Select(s => s + pattern.Subssortingng(capturedLastIndex, m.Index - capturedLastIndex)); } int from = int.Parse(m.Groups["From"].Value); int to = int.Parse(m.Groups["To"].Value); if (from > to) { throw new InvalidOperationException(); } ssortingngs = ssortingngs.SelectMany(s => Enumerable.Range(from, to - from + 1), (s, i) => s + i.ToSsortingng()); lastIndex = m.Index + m.Length; } if (lastIndex < pattern.Length) { var capturedLastIndex = lastIndex; strings = strings.Select(s => s + pattern.Subssortingng(capturedLastIndex)); } return ssortingngs; } 

Fondamentalement, le code construit toutes les solutions pour le motif regex. Il les calcule même dans l’ordre alphabétique.

Méfiez-vous de la variable captureLastIndex. Il est requirejs car le compilateur capturerait autrement la variable lastIndex, ce qui entraînerait des résultats incorrects.

c’est mon code qui travaille maintenant pour moi. pas très générique et seulement pour deux expressions possibles dans la chaîne mais ça marche;)

  List possibleMatches = new List(); ssortingng expression = "123?[3-9]" //this is an example if (expression.Contains("?") || expression.Contains("[")) { int count = expression.Count(f => f == '?'); count += expression.Count(f => f == '['); if (count <= 2) { string pattern = expression.Replace('*', '.').Replace('?', '.'); pattern = pattern.Replace(".", "[0-9]"); int pos1 = pattern.IndexOf('['); int start1 = Convert.ToInt32(pattern[pos1 + 1].ToString()); int end1 = Convert.ToInt32(pattern[pos1 + 3].ToString()); int pos2 = 0; int start2, end2 = 0; if (count > 1) { pos2 = pattern.IndexOf('[', pos1); start2 = Convert.ToInt32(pattern[pos2 + 1].ToSsortingng()); end2 = Convert.ToInt32(pattern[pos2 + 3].ToSsortingng()); pattern = pattern.Remove(pos1, "[0-9]".Length); pattern = pattern.Remove(pos2, "[0-9]".Length); ssortingng copy = pattern; for (int i = start1; i <= end1; i++) { copy = pattern.Insert(pos1, i.ToString()); for (int y = start2; y <= end2; y++) { possibleMatches.Add(copy.Insert(pos2, y.ToString())); } } } else { pattern = pattern.Remove(pos1, "[0-9]".Length); for (int i = start1; i <= end1; i++) { possibleMatches.Add(pattern.Insert(pos1, i.ToString())); } } }