2010-10-27 17 views
0

J'utilise .Net. Je veux faire correspondre le nom de famille qui a des caractères autres que a-z, A-Z, espace et guillemets simples et len ​​de charcuteries ne doit pas être entre 1-40. La chaîne qui doit être adapté est un aspect XML comme celui-ci <FirstName>SomeName</FirstName><LastName>SomeLastName</LastName><Address1>Addre1</Address1>Reg Ex négation

j'ai écrit expression regualr mais assortit ne [a-zA-Z » \ s.] {} <LastName>[a-zA-Z'.\s]{1,40}</LastName> 1,40 EDIT: LastName tag est manqué. Mais je veux obtenir la négation de cette expression. Est-ce possible ou devrais-je adopter une approche différente?

+0

Veuillez confirmer. Vous voulez exiger qu'il y ait plus de 40 caractères dans le nom ??? Comptez-vous votre XML dans le cadre de votre longueur?Je vous recommande d'utiliser un analyseur XML afin que vous puissiez gérer le nom de famille uniquement pour la validation ... mais c'est juste moi. –

+0

J'ai dit que je ne veux que des chartes de match qui ne soit pas entre 1 et 40. Cela signifie que seulement 40 charreteurs. XML ne fait pas partie de la longueur. Je ne peux pas analyser le xml dans ma situation. – Amzath

+0

Édité ma réponse ci-dessous ... pas sûr si vous êtes averti des modifications ou non, donc en ajoutant ce commentaire. –

Répondre

1

Vous pouvez avoir des classes de caractères nuls. [^abc] correspond à tout caractère qui n'est PAS a, b ou c. Pour votre cas, vous pourriez vouloir [^a-zA-Z'.\s]{1,40}

Puisque vos données sont dans des balises XML, vous voudrez probablement les extraire d'abord. Les expressions XML et régulières ne se mélangent pas toujours bien.


Si vous devez absolument traiter les balises XML dans le regex, vous pouvez essayer quelque chose comme ceci:

<FirstName>([^a-zA-Z'.\s]{1,40})</FirstName><LastName>([^a-zA-Z'.\s]{1,40})</LastName> 

groupe Capture 1 sera le premier nom, le groupe de capture 2 sera le dernier nom .


question Misread originale, si vous voulez faire correspondre les chaînes plus de 40 caractères, la longueur doit être {41,} pas {1,40}. Cela vous permettra de faire correspondre uniquement les chaînes de plus de 40 caractères.

+0

Il a échoué lorsque les cas où les caractères sont plus de 40 – Amzath

+0

En raison de restrictions de code, je ne peux pas analyser le code XML. Est-ce possible une négation appy sur XML? – Amzath

+0

Si le XML * reste * si simple, vous pouvez simplement trouver «», «», «», «» et toutes les adresses (si cela ne vous intéresse pas) et remplacer par null, et alors vous faites la correspondance regex. – FrustratedWithFormsDesigner

0

essayer ce modèle

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>" 
+0

ne fonctionnait pas pour ce SomeName. Reg ne devrait pas correspondre à la chaîne ci-dessus. – Amzath

+0

oui c'est clairement ne fonctionnera pas pour cette cause ce motif ne correspond pas az, pas AZ pas 'et pas d'espace ou de caractères de la longueur> 40, que ce dont vous avez besoin, vous avez dit que vous voulez la négation d'une regex correspond aux caractères anglais, qoute et espace et la longueur entre 1 et 40. –

+0

si vous ne l'avez pas inclus dans le noeud LastName, il fonctionnera pour le texte de test que vous avez utilisé car il correspond au texte dont la longueur est supérieure à 40, essayez maintenant je mis à jour le modèle –

0

[EDIT] - Suppression d'autres choses. Voici quelque chose qui a fonctionné pour toutes les conditions (y compris vide) dans mes tests, y compris avoir le XML dans la chaîne testée.

/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/ 
+0

Oui, il y a des filtres de 100 écrits. Ils vérifient tous match.success == true après avoir appliqué reg ex dans .net. Situation Je suis dans ce que je ne peux pas changer le code match.success == false pour ce seul filtre. C'est la raison pour laquelle je veux tout mettre en œuvre dans les négociations sans pour autant devoir utiliser le code .net. – Amzath

+0

certains comment est manqué dans ma question. Veuillez vérifier les questions à nouveau. Je veux que ce regex doive être appliqué sur XML. Pas seulement sur le nom de famille extrait. – Amzath

+0

J'ai modifié reg comme ceci ^([a-zA-Z '\ s] * [^ a-zA-Z' \ s] + [a-zA-Z '\ s] *) | ([a- zA-Z '\ s] {41,}) mais ne correspondait pas à la chaîne qui contient le numéro en nom UnNom brian6 Addre1 Amzath

1

Vous semblez vouloir savoir comment un match de nier modèle sans utiliser des « pas » logique de type dans la langue, mais le plaçant dans le match de modèle lui-même. Si c'est ce que vous voulez dire, il vous suffit de convertir votre "regex" en "^(?:(?!regex).)*$".

La première est vraie pour toute chaîne contenant "regex", et la seconde est vraie pour toute chaîne qui ne contient pas "regex".

Je suppose que si vous voulez être conscient des chaînes d'entrée multilinéées, cela devrait être "\A(?:(?!regex)(?s).)*\z" juste pour être très prudent.

+0

J'ai essayé votre reg ex comme ceci ^(?: (?! ([A-zA-Z '. \ S] {1,40})).) $.Mais ne correspond pas à la chaîne que contient le numéro dans le nom ast SomeName brian6 Addre1 Amzath

+0

@amz ce n'est pas correct. Vous avez mal compris. Bien sûr, cela ne correspond pas, vous avez des ancres à cordes entières au milieu du motif. Votre classe de personnage a tout faux. Vous devez dire ce que vous ne voulez pas, pas ce que vous faites. Si vous ne voulez pas de numéro, faites correspondre ce que vous voulez, puis cherchez s'il y a un numéro. Je crains que les constructions complexes de regex ne soient un peu compliquées pour ce que vous êtes en train de faire. – tchrist

+0

a obtenu une réponse d'un autre thread http://stackoverflow.com/questions/4044272/reg-ex-negation-not-working-in-xml-string – Amzath