Java Regulärer Ausdruck, um exaktes Wort mit Sonderzeichen zu vergleichen

8

Ich habe eine Liste von Stichwörtern, die vom Benutzer eingegeben wurden, und sie können die Sonderzeichen wie $, #, @, ^, &, etc. enthalten.

Gemäß meiner Anforderung muss ich, wenn ich eine Liste von Textnachrichten erhalte, nach allen Schlüsselwörtern in jeder Nachricht suchen.

Wir müssen genau passendes Keyword finden.

Fall 1: Einfaches Schlüsselwort - Einfache Nachricht

Ich habe \b verwendet, um exaktes Keyword zu finden, und funktioniert gut.

%Vor%

OUTPUT wie erwartet

%Vor%

Fall 2: Einfaches Schlüsselwort - Nachricht mit Sonderzeichen

Wenn ich nun für die folgenden Nachrichten denselben Code verwende, funktioniert nicht wie erwartet .

%Vor%

AUSGABE:

%Vor%

Erwarteter OUTPUT

%Vor%

Fall 3: Keyword & amp; Nachricht mit Sonderzeichen

Wenn ich folgende Nachrichten erhalte und das Schlüsselwort ist #Hello . Ich habe folgenden Code geschrieben, aber hat nicht funktioniert .

%Vor%

AUSGABE:

%Vor%

Erwartete Ausgabe:

%Vor%

Wie kann ich den Sonderzeichen entkommen und CASE 2 and CASE 3 auflösen.

Bitte helfen Sie.

    
Ankur Raiyani 04.08.2013, 17:08
quelle

5 Antworten

3

Fall 2 scheint das Gegenteil von Fall 3 zu sein, also glaube ich nicht, dass Sie Pattern s kombinieren können.

Für Fall 2 könnte Ihr Pattern wie folgt aussehen:

%Vor%

In diesem Fall umgeben wir das Schlüsselwort mit Whitespace oder Anfang / Ende der Eingabe.

Für Fall 3 könnte Ihr Pattern wie folgt aussehen:

%Vor%

In diesem Fall werden dem Schlüsselwort die Sonderzeichen Ihrer Wahl vorangestellt (beachten Sie die reservierten reservierten Zeichen $ und ^ ), dann akzeptieren wir Leerzeichen oder das Ende der Eingabe als Zeichen nach dem Schlüsselwort .

    
Mena 04.08.2013, 17:17
quelle
2

Verwenden Sie (?:^|\s) ("Anfang von Text oder Leerzeichen") statt der ersten \b und (?:$|\s) ("Ende von Text oder Leerzeichen") anstelle der zweiten \b in Ihrer Regex.

    
Alex Shesterov 04.08.2013 17:17
quelle
1

Versuchen Sie vielleicht so

%Vor%

(? & lt; = ...) und (? = ...) ist positiv Blick hinter und voraus so wird es überprüfen, ob Ihr searchedStubstring

haben wird
  • Leerzeichen \s oder Beginn der Eingabe ^ vorher und
  • Leerzeichen \s oder Ende der Eingabe & danach.

Auch wenn Sie nach Sonderzeichen wie $ + und anderen suchen möchten, müssen Sie ihnen entkommen. Um dies zu tun, können Sie Pattern.quote(searchedStubstring)

verwenden     
Pshemo 04.08.2013 17:24
quelle
1

Das Problem kommt von der Art, wie "genaues Wort" definiert ist. Es ist nicht nur ein Leerzeichen, das das Wort umschließen kann, um es zu einem Wort zu machen. Zum Beispiel würde man in den meisten Fällen eine exakte Wortübereinstimmung für 'Hello' wünschen, mit der gearbeitet werden kann.

"hallo da", "Dieser junge Mann sagte gerade Hallo zu diesem anderen jungen Mann" und "Ich wünschte, die Leute würden immer noch ans Telefon gehen, indem sie Ahoi anstatt Hallo sagen."

Wenn Sie möchten, dass die Übereinstimmung nur auf Whitespaces aufgeteilt wird, müssen Sie die Whitespace-Bedingung angeben. Angenommen, Sie möchten auch, dass es am Ende übereinstimmt, dann würde ich so etwas vorschlagen.

%Vor%

und dann ein paar Methoden wie folgt

%Vor%

Es wäre wahrscheinlich besser, über ein Zeichen [] für die Escape-Zeichen zu iterieren und sie aus einer Konfigurationsdatei zu laden.

    
James Robinson 04.08.2013 17:21
quelle
0

zum Beispiel, wenn dein Wort am Anfang und am Ende ein spezielles Zeichen (zum Beispiel '#') haben möchte, musst du folgendes schreiben:

%Vor%

wenn Sie eine exakte Übereinstimmung wünschen:

%Vor%

mit '|' ist wie OR, also können Sie spezielle Zeichen hinzufügen, die Sie wollen .. zum Beispiel:

%Vor%

char '^' bedeutet, dass die Zeichenkette am Anfang der Zeile erkannt wird und '$' bedeutet am Zeilenende. mehr hier sehen: Zusammenfassung der Konstrukte für reguläre Ausdrücke

    
a.s.p. 05.04.2014 14:12
quelle

Tags und Links