2016-06-17 7 views
0

beginnt Ich habe wirklich eine harte Zeit, eine Regex zu erstellen, die ein Wort findet, aber wenn und nur wenn es die Zeile nicht beginnt mit - .Regex, um Wörter zu finden, die in einer Zeile sind, die nicht mit

Zum Beispiel:

Geben Sie für Wort: wenn

-- check if //should not match 
-- more random words if //should not match 
check if //should match 

ich versucht habe, mit negativen Lookbehinds wie:

(?<!-- .*)\bif\b 

Aber ich bin mit JAVA und auch, kann ich nicht verwenden Quantifizierer in Lookbehinds.

Wenn ich versuche,

(?<! --)\bif\b 

Es funktioniert auf

-- if \\works 
-- if \\does not work 

ich die Verwendung von SKIP und F fand heraus, aber, so scheint es JAVA nicht diese beiden gerecht zu werden.

Irgendwelche Ratschläge, wie kann ich damit umgehen?

Danke!

+2

Was ist los mit '! Line.startsWith (" - ") && line.matches (" \\ bif \\ b ")'? Gibt es einen guten Grund, alles komplizierter zu machen, indem Sie darauf bestehen, dass Sie alles mit einer Regex machen müssen? – ajb

+0

Hi @ajb, ich habe einen mehrzeiligen Text mit mehreren Wörtern zu entsprechen. Ich habe bereits eine Schleife, die alle Wörter durchläuft, die ich zuordnen muss. Ich benutze text.replaceall, so dass ich nicht den gesamten Text nach \ n aufteilen und jede Zeile durchlaufen muss, während ich durch jedes Keyword, das ich zuordnen muss, iteriere. –

+0

@Takeshi Der Kommentar von ajb ist Spot auf AFAIK. Die Regex, die Sie benötigen, wäre wahrscheinlich komplex, während die Verwendung von Java-String-Operationen einfach und einfacher zu verwalten wäre. –

Antwort

0

Angenommen, Sie sind mit Hilfe von Java 8, könnten Sie so etwas tun:

Pattern p = Pattern.compile("^(?!--).*if"); 
    Predicate<String> pred = s -> {return p.matcher(s).find();}; 
    Files.lines(Paths.get("files/input.txt")) 
     .filter(pred).forEach(System.out::println); 

Es ist eine negative look ahead genannt. Ich hoffe, es hilft.

0

Ich weiß nicht, wie lange Ihre Linien sind, aber Sie können zum Beispiel dieses hässliche Bau verwenden (natürlich könnte Nummer kleiner sein):

(?m)(?<!^--.{0,99999999999999999})if 

EXAMPLE

Java erlaubt einige Intervall quantifiers schaue nach hinten und schaue nach vorne, aber es sieht einfach falsch aus: P aber es funktioniert, zumindest funktioniert es bei mir in diesem Beispiel.

Eine andere Herangehensweise, wenn Sie alle Vorkommen raplace wollen, warum nicht einfangende Gruppen verwenden? wie:

String[] examples = {"-- check if ", 
     "-- more random words if ", 
     "check if ", "-- f", 
     "-- check if \n-- more random words if \ncheck if "}; 
for(String string : examples) { 
    System.out.println(string.replaceAll("(?m)(?!^--)^(.*?)if","$1" + "replacement")); 
    System.out.println(); 
} 

Regex (?m)(?!^--)^(.*)(if) wird alles zusammenpassen Wort gesucht und erfassen sie in Gruppe 1, dann in raplacement können Sie sie in Text zurückstellen. Nicht sehr effizient, sollte aber trotzdem funktionieren.

+0

Code wie das macht mich nervös. –

Verwandte Themen