2012-04-13 6 views
1

Ich möchte einen regulären Ausdruck verwenden, um Vorkommen zu finden. Zum Beispiel geben Benutzer folgendes ein:Suchen nach Vorkommen mit regulärem Ausdruck (Java-Engine)

word1 code1 -10001! keine

das bedeutet: Such word1 UND code1 UND -10.001 UND NICHT keine

Dieses Kriterium verwendet werden, einen regulären Ausdruck zu bauen.

ich solche Textzeilen haben: - „world12 einschließlich ist GCode10 -10.001“

1 „Meine übliche word12 einschließlich ist GCode10 -10.001 Aufzeichnungsende“ // Dies sollte wahr sein und zurück

2 - "Dies ist eine andere Linie word12 wird einschließlich GCode10 -10.001 keine End of record" // Diese falsch sein sollte und das Rück nichts

Ich versuchte dies:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)((?!none).)*$ 

Es funktioniert für 1 Zeile, aber es zurückgeben ganze Linie

ich habe auch versucht diese:

(\\w*word1\\w*).*(\\w*code1\\w*).*(\\w*-10001\\w*)(?!none) 

Aber es gab mir nur "word12", "GCode10", aber es verpasste "-10001" und außerdem passt es für die zweite Zeile! Es sollte nicht.

Ich bin kein Experte in regexp ...

+0

'logged' wurde nicht in Ihrer Frage erwähnt, aber Sie scheinen in Ihrer Regex mit negativen Lookahead zu verwenden. – anubhava

+0

Entschuldigung, ein Fehler ... – Zamboo

+0

Haben Sie daran gedacht, eine einfache Schleife zu verwenden, um nach diesen Dingen zu suchen? Was passiert, wenn der Benutzer 'word *' eintippt? –

Antwort

2

Sie es fast geschafft wurden, verwendet man nur die negative Vorschau falsch:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$ 

Sie sollten auch die Regex mit der mehrzeilige Option kompilieren es sei denn, Sie behandeln jede Zeile als separate Zeichenfolge. Also, wenn subjectString ist eine mehrzeilige Zeichenfolge,

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$", Pattern.MULTILINE); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

wird Ihnen eine Liste aller Linien, die Ihren Kriterien entsprechen.

Wenn Sie mit Benutzereingaben arbeiten, möchten Sie möglicherweise Pattern.quote() für alle Zeichenfolgen aufrufen, die Ihre Benutzer Ihnen geben, so dass alle Metazeichen für Regex maskiert werden.

+0

Ja, es funktioniert, aber es ruft die ganze Linie ab. Ich möchte nur Artikel vom ersten bis zum letzten Vorkommen. In dem Beispiel, das ich gab, wird es auch "Meine übliche ..." abrufen. – Zamboo

+0

Danke für die "Pattern.quote()", das wusste ich nicht. – Zamboo

+0

@Zamboo: Ah, das habe ich übersehen. Nun, das ist nicht so einfach - ich erwarte, dass die zulässigen Muster in beliebiger Reihenfolge auftreten können. Wenn die Reihenfolge nicht festgelegt ist, wird dies nicht trivial sein. –

Verwandte Themen