2016-11-30 7 views
1

Ich habe eine Erklärung, wie untenRegexMuster zu negieren ein Zeichen

#sv_q = " INSERT INTO alertuser.REALTIME 

Ich versuche, einen regulären Ausdruck zu erstellen, die von einer Reihe von Zeilen aus der Datei diese Zeile passen, wann immer Einsatz Schlüsselwort verwendet wird . Aber da am Anfang ein '#' verwendet wird, möchte ich diese Zeile nicht berücksichtigen. Wie man das erreicht. Ich habe versucht, den unten stehenden Regex, aber immer noch diese Zeile wird in Betracht gezogen, kann jemand vorschlagen, wie dies zu erreichen?

static Pattern tracePattern = Pattern.compile("(?!\\#).*insert\\s*into",Pattern.CASE_INSENSITIVE); 
Matcher localMatcher = tracePattern.matcher(line); 
if (localMatcher.find()) { 
    // doing some checks 
} 
+0

Verwenden Sie die Regex, die Sie mit 'Matcher # matches()' haben. –

+0

Hilft es? Bitte teilen Sie Ihren Code. –

+0

statisches Muster tracePattern = Pattern.compile ("(? Arjun

Antwort

1

Wenn Sie .find() verwenden möchten, müssen Sie Anker das Muster am Anfang mit ^ oder \A. Außerdem solltest du besser Grenzen Gebrauch Wort nur ganze Wörter insert und into, entsprechen und verwenden \s+ statt \s* zwischen insert mindestens 1 Auftreten eines Leerzeichen zu erzwingen und into:

"^(?!#).*\\binsert\\s+into\\b" 

Sie Ihre Lösung verkürzen konnte zu

if (s.matches("(?i)(?!#).*\\binsert\\s+into\\b.*")) { doing some checks} 

die matches() Methode erfordert eine vollständige Zeichenfolge Spiel, und so müssen Sie die .* am Ende hinzuzufügen. Die Pattern.CASE_INSENSITIVE Option kann auch inline mit Hilfe der eingebetteten Flag-Option (?i) verwendet werden. Wenn Ihre Eingabe Zeilenumbrüche enthalten kann, verwenden Sie (?si) anstelle von (?i).

+0

Wenn Sie dieses Muster verwenden, werden die Datensätze, die ausgewählt werden sollen, nicht ausgewählt. – Arjun

+0

Was meinst du mit "ausgewählt"? Regex entspricht entweder einer Zeichenfolge oder nicht. –

+0

ja .. die Regex stimmt nicht mit der Zeichenfolge überein. – Arjun