2009-02-28 17 views
0

übereinstimmen Ich habe die folgende Methode in einigen Nemerle Code:Syntaxfehler in Regulärer Ausdruck Link 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 
    } 

das Problem ist, dass der Compiler aus irgendeinem Grund die Klammern in der Regex-Anweisung versucht, und zu analysieren, ihre verursacht das Programm nicht kompilieren. Wenn ich das @ entfernen, (was ich gesagt wurde, dort zu setzen) bekomme ich ein ungültigen Escape-Zeichen-Fehler auf dem „\ s“

Heres Compiler Ausgabe:

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 `]' 

(Linie 23 die Linie mit dem Regex-Code darauf)

Was soll ich tun?

Antwort

3

Ich weiß nicht, Nemerle, aber es scheint, als ob die Verwendung von @ deaktiviert alle Escapes, einschließlich der Flucht für die ".

Versuchen Sie eine der folgenden Optionen:

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

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

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

Nur für das Protokoll, das Feature „wörtlich genannt wird Zeichenfolgenliterale ". – CMS

1

Das Problem ist mit den Anführungszeichen, nicht die Klammern. In Nemerle, wie in C#, können Sie ein Anführungszeichen mit einem anderen Anführungszeichen und keinen umgekehrten Schrägstrich umgehen.

EDIT: Beachten Sie auch, dass Sie das Rohr nicht innerhalb der eckigen Klammern brauchen; Der Inhalt wird als eine Menge von Zeichen (oder Zeichenbereichen) behandelt, wobei das ODER gemeint ist.

2

Ich bin nicht Nemerle Programmierer, aber ich weiß, dass yous IMMER XML-Parser für XML-basierte Daten verwenden sollte und nicht regexps.

Ich denke, jemand DOM oder XPath-Bibliothek für Nemerle erstellt hat, so dass Sie entweder Zugriff auf

// a [@href] über XPath oder so etwas wie a.href.value über DOM.

Das aktuelle regexp nicht zum Beispiel mag

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

habe ich nicht getestet, aber es sollte mehr sein, wie es

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

Hat das OP gesagt, dass er XML analysiert hat? Alles, was ich sehe, ist, dass er eine Regex auf einige Strings anwendet, die wie HTML-Anchor-Tags aussehen. Was die mögliche Anwesenheit anderer Attribute vor 'href' betrifft, würde ich annehmen, dass er weiß, dass das nicht passieren wird; es sind schließlich seine Daten. –

+0

Nun, er ist falsch mit dem XML-Teil, aber er hat Recht mit der Regex. es muss eine Klasse attributieren. Dort. –

+0

Das stimmt im Allgemeinen, aber wir sprechen über eine bestimmte Situation. Je mehr Sie die Regex verallgemeinern, desto komplizierter wird sie. Wenn Sie jemandem einen robusten, für sie völlig unverständlichen Regex geben, helfen Sie ihm wirklich? –