2009-08-26 5 views
0

J'ai eu du mal à trouver une expression régulière pour un petit projet. Quelqu'un peut-il m'aider avec une regex qui correspond à quelque chose à l'intérieur des symboles <>, mais seulement quand ils ne sont pas précédés d'un symbole \?Problème d'expression régulière

Par exemple:

<Escaped characters \<\> are right in the middle of this sentence.>, <Here is another sentence.> 

doit correspondre à

1: Square brackets \<\> are right in the middle of this sentence. 
2: here is another sentence. 

Jusqu'à présent, j'ai réussi

/<([^\\][^>]*?)>/ig 

mais qui donne

1: Escaped characters \<\ 
2: Here is another sentence. 

Qu'est-ce que je fais mal? :(

+0

Indentation le code de 4 espaces ou utilisez le bouton de code sur l'éditeur avec le texte que vous souhaitez afficher comme tapé en surbrillance. – beggs

+0

J'ai corrigé le balisage autant que j'ai trouvé des problèmes. S'il vous plaît jeter un oeil au code source pour voir ce que j'ai fait (suivez le lien d'édition), et vérifiez s'il y a un endroit manquant qui devrait être marqué comme code. Vous pouvez ensuite également supprimer vos commentaires. –

+0

Impossible de trouver les boutons d'édition, lol. Merci d'être si patient. Première utilisation du site, ça se voit? ;) –

Répondre

1

La réponse de Crimson ne fonctionne pas pour moi en tester dans le Regex Powertoy en utilisant <Escaped characters \<\> are right in the middle of this sentence.>, <Here is another sentence.> comme le test mais cela (semble) à travailler:

/<(?<!\\<).*?>(?<!\\>)/gi

me donne deux matches: <Escaped characters \<\> are right in the middle of this sentence.> et <Here is another sentence.>

Édition: J'ai regardé la chaîne que Gumbo ne correspond pas. Je n'ai pas de problèmes correspondant dans regex.powertoy.org:

alt text http://img362.imageshack.us/img362/3227/regexpowertoyorg.png

Dans les tests, je l'a changé regex posté original: /(?<!\\)<(.*?)(?<!\\)>/gi qui est plus efficace (moins sondes).

Je remarque aussi dans la sortie de regex.powertoy.org que la chaîne quatrième (\<hello <match\<this\>> but not this\> looks odd... the printed replacement is just match but the match detail clearly shows that the match is correct; match de \ `. But I also notices that the first and third test string replacements don't print the " » échapper aux crochets. Après un peu (mais pas exhaustive) jouer autour Je pense que c'est un problème avec l'affichage du texte via javascript, les crochets échappés n'impriment pas le caractère d'échappement, et les crochets non vides ne s'impriment pas du tout Je pense que cela est dû au fait que le javascript le voit comme HTML. Je pense que cette regex fonctionne correctement, mais vous devriez la tester hors ligne.

+0

C'est tout! Brillant monsieur, merci beaucoup. –

+0

Ne fonctionne pas pour ' bar>'. – Gumbo

+0

@Gumbo: fonctionne pour moi, voir modifier. – beggs

0

Qu'est-ce que vous avez besoin sont-behind opérateurs regard En savoir plus sur eux ici.

http://www.perl.com/pub/a/2003/07/01/regexps.html

Et voici l'expression dont vous avez besoin:

/<(?!<\\).*>(?!<\\)/ 

Comme l'opérateur * ci-dessus est gourmand, il doit inclure toutes les équerres échappées/< />

EDIT: Je suppose que vous voulez des équerres échappées t o être apparié et retourné. Si vous voulez quelque chose de différent, s'il vous plaît préciser - donner un exemple succinct a) la chaîne d'entrée et b) le match à retourner

+0

Merci pour la réponse. Je suis après le contenu à l'intérieur de chaque ensemble d'équerres. Un exemple d'entrée: ", , il y a des parenthèses dans celui-ci>". Cela affichera trois chaînes différentes auxquelles j'accéderai avec des références arrières. Ce sont "exemple", "ceci est le texte" et "Oh Dieu \ <\> il y a des crochets dans celui-ci". –

0

Essayez cette

/<[^\\]([^>]+)>/ 
+0

Ceci ne vérifie pas les équerres échappées qui doivent être incluses. –

1

J'utiliser:

/<((?:[^\\>]+|\\.)*)>/ 
+0

Fonctionne bien. Moins de sondes que la mienne. – beggs