2014-09-18 12 views
5

Ich versuche, Knoten in einer Neo4j-Datenbank zu entsprechen. Die Knoten haben eine Eigenschaft namens "name" und ich verwende regulären Ausdruck in Cypher, um dies zu erreichen. Ich möchte nur ganze Wörter zusammenbringen, also sollte "javascript" nicht übereinstimmen, wenn ich die Zeichenkette "java" anbiete. Wenn die übereinstimmende Zeichenfolge aus mehreren Wörtern besteht, d. H. "Java-Skript", werde ich zwei getrennte Abfragen durchführen, eine für "Java" und eine für "Skript". DieseCypher Abfrage mit regulärem Ausdruck

ist das, was ich bisher:

match (n) where n.name =~ '(?i).*\\bMYSTRING\\b.*' return n 

Dies funktioniert, aber es funktioniert nicht mit einigen Sonderzeichen wie „+“ oder „#“ arbeiten. So kann ich nicht nach "C++" oder "C#" usw. suchen. Der reguläre Ausdruck im obigen Code verwendet nur \ b für die Wortgrenze. es entkommt auch, damit es richtig funktioniert.

Ich habe versucht, einige Versionen dieses Beitrags: regex to match word boundary beginning with special characters, aber es hat nicht wirklich funktioniert, vielleicht habe ich etwas falsch gemacht.

Wie kann ich das mit Sonderzeichen in Cypher und Neo4j arbeiten lassen?

Antwort

3

Versuchen Sie, die Sonderzeichen zu umgehen und suchen Sie nach Nicht-Wort-Zeichen und nicht nach Wortgrenzen. Beispielsweise;

Obwohl dies immer noch einige Fehlalarme hat, stimmen die obigen Beispiele zum Beispiel mit "C+++" überein.

Für "Nicht-Wort-Zeichen, außer dass wir + als ein Wortzeichen behandeln wollen" könnte das Folgende funktionieren.

match (n) where n.name =~ '(?i).*(?:[\\W-[+]]|^)C\\+\\+(?:[\\W-[+]]|$).*' return n 

Obwohl dies nicht von allen regexp Aromen unterstützt, und ich bin nicht sicher, ob Neo4j dies unterstützt.

+1

Dies würde normalerweise funktionieren, aber die \ b Wortgrenze funktioniert nur mit alphanumerischen Zeichen, so dass Eigenschaften wie "C++" (die entweder mit einem Sonderzeichen beginnt oder endet) nicht übereinstimmen. Es würde Eigenschaften wie "C++ C" entsprechen, da es mit einem "C" endet. –

+0

@ Øyvind Aktualisiert. – Taemyr

+0

Das funktionierte, aber es stimmte auch überein, wenn vor oder nach der Zeichenfolge Zeichen vorhanden waren, wie Sie in der aktualisierten Antwort angeben. Gibt es eine Möglichkeit, dass es nur auf ganze Wörter passt? Wäre die aktualisierte Antwort nicht die gleiche wie '(? I). * C \\ + \\ +. *'? –

1

Sie können Leerstellen (oder gar nichts - Grenze der Übereinstimmung) vor und hinter Ihrer Übereinstimmung setzen, anstatt Wortgrenzen zu setzen. Siehe dazu:

(?i).*(?<!\\S)MYSTRING(?!\\S).* 

Hier legen Sie mit einem regex demo Geige kann. Es passt nur zu Ihrer Zeichenfolge, wenn es zwischen Leerzeichen oder Grenzen für Front und nach Ihrem Wort ist. Sie können „Zeichensetzung“ definieren, wenn Sie benötigen, wie folgt aus:

(?i).*(?<![^\\s.,$])MYSTRING(?![^\\s.,$]).* 
       ^^^ add boundaries ^^^ 

Dann wird es auch rawrssss MYSTRING. dd entsprechen.

Siehe a regex demo!

Verwandte Themen