Est-ce que vous connaissez un moyen simple / propre pour trouver une sous-chaîne dans une chaîne tout en ignorant certains caractères spécifiés pour le trouver. Je pense qu'un exemple expliquerait mieux les choses: p>
Utiliser Regex n'est pas une exigence pour moi, mais j'ai ajouté la balise car elle se sent liée. P>
Pour rendre l'exigence plus claire: j'ai besoin de la sous-chaîne qui en résulte avec em> les caractères ignorés, pas seulement une indication que la sous-chaîne donnée existe. P>
Et en tant que bonus (non requis en soi), ce sera génial s'il ne serait pas non plus sûr de supposer que la sous-chaîne Désolé si je n'étais pas clair avant, ou je ne suis toujours pas :). P>
Merci à tous ceux qui ont aidé!, C'est la mise en œuvre avec laquelle je travaille pour l'instant: p>
A ici sont quelques tests: P>
J'utilise des méthodes d'extension personnalisées, je ne comprends pas, mais je crois qu'ils devraient être auto-expliqués (je vais les ajouter si vous aimez)
J'ai pris beaucoup de vos idées pour la mise en œuvre et les tests, mais je donne la réponse à @pierroz parce qu'il était l'un des premiers et m'a dirigé dans la bonne direction.
N'hésitez pas à continuer à donner des suggestions comme des solutions alternatives ou des commentaires sur l'état actuel de l'IPL. Si vous aimez. P>
8 Réponses :
Ce code fera ce que vous voulez, bien que je vous suggère de le modifier pour mieux répondre à vos besoins:
string resultString = null; try { resultString = Regex.Match(subjectString, "Hello[, -]*this", RegexOptions.IgnoreCase).Value; } catch (ArgumentException ex) { // Syntax error in the regular expression }
Merci, mais j'ai besoin de quelque chose de plus général, mon exemple était juste que :)
Vous pouvez le faire avec une seule regex, mais il serait assez fastidieux que chaque personnage aurait besoin de tester des caractères zéro ou plus ignorés. Il est probablement plus facile de supprimer tous les caractères ignorés avec ou la célibataire manière p> regex.replace (sujet, "[-,]", ""); code> puis testez si la sous-chaîne est là.
Bonjour, je pense que je ne peux pas dépouiller les personnages car j'ai besoin de la sous-chaîne résultante avec les caractères. Merci!
Dans votre exemple, vous ferez:
public string Test(string query, string input, char[] ignorelist) { string ignorePattern = "["; for (int i=0; i<ignoreList.Length; i++) { if (ignoreList[i] == '-') { ignorePattern.Insert(1, "-"); } else { ignorePattern += ignoreList[i]; } } ignorePattern += "]*"; for (int i = 0; i < query.Length; i++) { pattern += query[0] + ignorepattern; } Regex r = new Regex(pattern); Match m = r.Match(input); return m.IsSuccess ? m.Value : string.Empty; }
Bonjour!, J'avais déjà pensé à cette option et cela fonctionne définitivement pour moi. Je cherchais quelque chose de nettoyant qui ne nécessite pas que je construis la regex dinamiquement. Mais vous méritez la "réponse" si rien de tel que cela n'apparaît. Salutations.
Oui, je ne suis pas sûr que nous puissions éviter quelque chose comme ça. En outre, dans la liste des ignorés, nous devrons prendre soin de tels personnages que "?" ou "+" et tous ceux utilisés dans la syntaxe de regex. Il y a un seuil de travail sur la méthode de test :)
Vous avez raison, mais ça va si cela reste comme un exercice pour moi :). Si je viens en mettre en œuvre de cette façon, je m'essaierai de vous rappeler de mettre à jour la question avec la mise en œuvre plus généralisée ou un lien vers celui-ci. Merci beaucoup pour votre aide.
edit: strong> Voici une solution mise à jour adressant les points de votre mise à jour récente. L'idée est la même sauf si vous avez une sous-chaîne, il aura besoin d'insérer le motif d'ignorer entre chaque caractère. Si la sous-chaîne contient des espaces, il se divisera sur les espaces et insérera le motif d'ignorer entre ces mots. Si vous n'avez pas besoin de cette dernière fonctionnalité (qui était plus conforme à votre question originale), vous pouvez supprimer le Notez que cette approche ne sera pas la plus efficace. P> Split code> et
si code> vérifie qui fournit ce modèle .
string[] searchString = substring.Split(new[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
Voici une option d'extension de chaîne de non-regex:
public static class StringExtensions { public static bool SubstringSearch(this string s, string value, char[] ignoreChars, out string result) { if (String.IsNullOrEmpty(value)) throw new ArgumentException("Search value cannot be null or empty.", "value"); bool found = false; int matches = 0; int startIndex = -1; int length = 0; for (int i = 0; i < s.Length && !found; i++) { if (startIndex == -1) { if (s[i] == value[0]) { startIndex = i; ++matches; ++length; } } else { if (s[i] == value[matches]) { ++matches; ++length; } else if (ignoreChars != null && ignoreChars.Contains(s[i])) { ++length; } else { startIndex = -1; matches = 0; length = 0; } } found = (matches == value.Length); } if (found) { result = s.Substring(startIndex, length); } else { result = null; } return found; } }
Voici une manière non réégégeuse de le faire à l'aide d'une analyse de chaîne.
private string GetSubstring() { string searchString = "Hello, -this- is a string"; string searchStringWithoutUnwantedChars = searchString.Replace(",", "").Replace("-", ""); string desiredString = string.Empty; if(searchStringWithoutUnwantedChars.Contains("Hello this")) desiredString = searchString.Substring(searchString.IndexOf("Hello"), searchString.IndexOf("this") + 4); return desiredString; }
Vous pouvez faire quelque chose comme ça, puisque la plupart de ces réponses nécessitent de reconstruire la chaîne sous une forme.
string1 est votre chaîne que vous souhaitez examiner via p>
//Create a List(Of string) that contains the ignored characters' List<string> ignoredCharacters = new List<string>(); //Add all of the characters you wish to ignore in the method you choose //Use a function here to get a return public bool subStringExist(List<string> ignoredCharacters, string myString, string toMatch) { //Copy Your string to a temp string tempString = myString; bool match = false; //Replace Everything that you don't want foreach (string item in ignoredCharacters) { tempString = tempString.Replace(item, ""); } //Check if your substring exist if (tempString.Contains(toMatch)) { match = true; } return match; }
Vous pouvez toujours utiliser une combinaison de recherche de regex et de recherche de chaîne } p> utilisation serait comme p> entrée: Bonjour, -C'est-ce qu'une chaîne
Ignorer: -,
Trouver: Bonjour Ceci P> a été assorti p> entrée: Bonjour, -C'est-ce qu'une chaîne
Ignorer: -,
Trouver: Bonjour Ceci2 P> n'était pas assorti p> entrée:? A & 3/3 / C) 412 &
Ignorer: & / 3c)
Trouver: A41 P> a été assorti p> entrée :? A & 3/3 / c) 412 &
Ignorer: & / 3c)
Trouver: A41 P> n'a pas été assorti p> entrée :? a & 3/3 / c) 412 &
Ignorer: & / 3c)
Trouver: A3C412 & P> a été assorti p> p>
@Fredy Jetez un coup d'œil à ma réponse mise à jour qui, si j'ai bien compris correctement, devriez couvrir vos scénarios mis à jour.
@Fredy - est-il sûr de conclure que vous vous attendez à ce que la chaîne d'entrée et la chaîne de recherche soient propres des caractères indésirables avant de rechercher? Si tel est le cas, ci-dessous, j'ai fourni une solution à la fois à la fois à la fois à la recherche de regex et de recherche de chaînes.
@Ahmad - J'aime votre mise à jour, je vais prendre des idées de là, merci.
@Jamie Vous pouvez assumer la chaîne de rechercher n'a pas de "personnages ignorés" dessus, mais ce serait mieux si vous le permettez. Dans le cas de la chaîne d'entrée, il aura définitivement "caractères ignorés", c'est de l'idée :)