2009-02-28 8 views
0

je la méthode suivante dans un code de nemerle:erreur de syntaxe dans l'expression régulière pour correspondre lien url

private static getLinks(text : string) : array[string] { 
     def linkrx = Regex(@"<a\shref=['|\"](.*?)['|\"].*?>"); 
     def m = linkrx.Matches(text); 
     mutable txmatches : array[string]; 
     for (mutable i = 0; i < m.Count; ++i) { 
      txmatches[i] = m[i].Value; 
     } 
     txmatches 
    } 

le problème est que le compilateur pour une raison quelconque tente d'analyser les crochets dans l'instruction regex et son provoquant le programme de ne pas compiler. Si je supprime le @, (qui, on m'a dit de mettre là) je reçois une erreur de caractère d'échappement non valide sur le « \ de »

Heres la sortie du compilateur:

NCrawler.n:23:21:23:22: ←[01;31merror←[0m: when parsing this `(' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:22:57:22:58: ←[01;31merror←[0m: when parsing this `{' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:8:1:8:2: ←[01;31merror←[0m: when parsing this `{' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 

(ligne 23 est la ligne avec le code regex dessus)

Que dois-je faire?

Répondre

3

Je ne connais pas Nemerle, mais il semble que l'utilisation de @ désactive toutes les échappées, y compris l'échappement pour le ".

Essayez l'un de ces:

def linkrx = Regex("<a\\shref=['\"](.*?)['\"].*?>"); 

def linkrx = Regex(@"<a\shref=['""](.*?)['""].*?>"); 

def linkrx = Regex(@"<a\shref=['\x22](.*?)['\x22].*?>"); 
+0

Pour la petite histoire, cette fonction est appelée « mot pour mot littéraux de chaîne ". – CMS

1

Le problème est avec les guillemets, pas les parenthèses. Dans Nemerle, comme dans C#, vous échappez à un guillemet avec un autre guillemet, pas un backslash.

@"<a\shref=['""](.*?)['""].*?>" 

EDIT: Notez également que vous n'avez pas besoin du tuyau à l'intérieur des crochets; le contenu est traité comme un ensemble de caractères (ou de plages de caractères), l'opérateur OR étant implicite.

2

Je ne suis pas programmeur Nemerle mais je sais que vous devriez toujours utiliser XML parser pour les données basées sur XML et non sur les regexps.

je suppose que quelqu'un a créé DOM ou d'une bibliothèque XPath pour Nemerle afin que vous puissiez accéder soit

// un [@href] via XPath ou quelque chose comme a.href.value via DOM.

Ce regexp actuel n'aime pas par exemple

<a class="foo" href="something">bar</a> 

Je n'ai pas testé cela, mais il devrait être plus comme il

/<a\s.+?href=['|\"]([^'\">]+)['|\"].+?>/i 
+0

Est-ce que le PO a dit qu'il analysait XML? Tout ce que je vois, c'est qu'il applique une regex à certaines chaînes qui ressemblent à des balises d'ancrage HTML. Quant à la présence possible d'autres attributs avant «href», je suppose qu'il sait que cela n'arrivera pas; ce sont ses données, après tout. –

+0

bien il est incorrect avec la partie XML, mais il a raison sur l'expression régulière. il faut tenir compte d'une classe attrib. Là. –

+0

C'est vrai en général, mais nous parlons d'une situation spécifique. Plus vous généraliser la regex, plus il devient compliqué. Si vous donnez à quelqu'un une expression rationnelle robuste et générale qui est totalement incompréhensible pour eux, les aidez-vous vraiment? –

Questions connexes