2010-12-13 4 views
1

Je veux vérifier un nom en utilisant une expression régulière, mais je ne reçois pas de résultat convaincant. Quelqu'un pourrait-il suggérer ce que je fais dans mon schéma d'expression régulière?Expression régulière confusion

foreach(Match m in 
(Regex.Matches("Jack_Sparrow","^[A-za-z]+[^-]*(\\d)*$"))) 
    { 
     Console.WriteLine("{0} found at index{1}",m.Value,m.Index); 
    } 

Puis-je savoir pourquoi je suis en train de Jack_Sparrow en sortie, en dépit de ne pas vérifier underscore (_) dans le crépitement? Je veux plutôt Jack Sparrow comme une sortie. Quelle est la modification dont j'ai besoin?

+1

ressemble à ce que vous * avez besoin * est de faire un 'str_replace (" _ "," ", $ nom d'utilisateur)'. Mais à moins de décrire un peu mieux votre problème ou de donner quelques exemples supplémentaires, personne ne peut vraiment le savoir. – mpen

Répondre

1

La première moitié de votre gamme de caractères inclure

[A-za-z] crée une gamme de majuscules a à minuscules z, puis une autre plage d'un minuscule en minuscule z.Ces plages se chevauchent dans leur deuxième partie en raison de la façon dont les valeurs ASCII fonctionnent.En particulier, A-z crée une plage allant du caractère ASCII 65 (A) au caractère 12 2 (z). Le caractère de soulignement a la valeur 95, qui est entre. Puisque votre regex est ancrée, cette classe de caractères est is where the match is occurring. J'ai modifié votre classe de caractères pour inclure des parenthèses de regroupement dans cet exemple afin que vous puissiez voir qu'il capture le texte entier de "Jack_Sparrow".

Vous devriez pouvoir résoudre cette correspondance spécifique en changeant la plage de caractères pour qu'elle soit [A-Za-z] à la place. Cependant, il correspondra toujours à la première partie ("Jack"), puis la partie [^-]* correspondra au reste de la chaîne ("_Sparrow"), ce qui entraînera toujours une correspondance valide. Si vous pouvez fournir d'autres exemples de texte, nous pouvons vous aider à les affiner davantage. Avec les informations actuelles que vous avez fournies, il est difficile de dire comment corriger au mieux le problème [^-].

+0

Charles a toujours raison de dire que même s'il corrige cela, il continuera à correspondre en raison de '[^ -]'. – mpen

+0

@Ralph: Oui, juste noté cela. J'aurais dû le mentionner précédemment. – eldarerathis

+0

Euh ... pas vraiment. Il termine son regex avec '$'. Il doit correspondre à la fin de la chaîne, sinon il ne correspondra pas du tout. Cela * ne * correspondra pas seulement à "Jack". – mpen

1

[^-] vérifie tout caractère autre que -, ce qui correspond au trait de soulignement. Je ne suis pas sûr exactement ce que vous voulez faire correspondre ici.

Essayez-vous de changer tout autre chose que des lettres dans des espaces, peut-être?

+0

Si j'omets [^ -], j'obtiens alors "Jack_Sparrow" en sortie. Puis-je savoir pourquoi? – Justin

0

foreach (Match m dans (Regex.Matches ("Jack_Sparrow", "[^ A-Za-z]")) { Console.WriteLine ("{0} trouvées à l'index {1}", m.Value, m.Index). }