2012-04-02 12 views
0

Ich versuche, eine beliebige Aufzählungsliste in einem freien Text Dokument zu entsprechen. Aufzählungslisten werden als Zahl oder Kleinbuchstaben definiert, der ein Worttrennzeichen vorangestellt wird. So zum Beispieljava regulären Ausdruck finden Aufzählungslisten

1. item a 
2. item b 

Ich verwende den folgenden Code, um die Kugeln zu finden:

Pattern p1 = Pattern.compile("\\s[\\d][\\.\\)]\\s"); 

Das funktioniert gut, solange die Aufzählungsliste von einstelligen Elementen bestehen. Doch sobald ich mehrstelligen Aufzählungen versuchen, wird es nicht funktionieren (Beispiel 12. item c 13. item d) Ich versuchte, das das Muster zu

Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s"); 

oder

Pattern p1 = Pattern.compile("\\s[\\d]\\+[\\.\\)]\\s"); 

Meine Interpretation der regex Sprache zu ändern ist dass dies zu jedem Fall passt, in dem 1 oder mehr Ziffern vor einem "." stehen. Aber das funktioniert nicht.

Kann jemand sehen, was ich falsch mache?

+0

Btw, könnten Sie definieren 'Aber das work.' nicht? – Thomas

+0

Das ist eine seltsame Definition von 'Bullet-Liste'. Was es wirklich bedeutet, ist eine Liste, deren Elemente durch 'bullet' Zeichen eingeführt werden. Was Sie suchen, ist Artikel in Buchstaben oder nummerierten Listen. – EJP

Antwort

1
Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s"); 

(Ihre zweite Version) funktionieren soll, aber man kann es vereinfachen:

Pattern p1 = Pattern.compile("\\s\\d+[.)]\\s"); 

Allerdings ist es Leerzeichen zu erwarten vor der Ziffer (so wird es zu Beginn der Zeichenfolge nicht überein , beispielsweise). Vielleicht ein word boundary ist hier nützlich:

Pattern p1 = Pattern.compile("\\b\\d+[.)]\\s"); 

(FYI: Ihr drittes Beispiel eine wörtliches + nach einer einzigen Stelle zu entsprechen versucht Deshalb ist es fehlgeschlagen.).

0

Ich nehme an, das Problem ist, dass nicht immer Whitespace vor den Ziffern ist. Ändern Sie daher den Ausdruck in (Java-String-Version) "\\s*\\d+[\\.\\)]\\s".

Beispiel:

10. aaa //no whitespace before 10 here, thus the leading whitespace has to be optional 
11. bbb //here the whitespace should match the new line which counts as whitespace 

Was die Kleinbuchstaben Version.

"\\s*(?:\\d+|[a-z]+)[\\.\\)]\\s" 

wo (?:\\d+|[a-z]+) bedeutet „eine Folge von entweder Ziffern oder Kleinbuchstaben

Beachten Sie, dass dies würde passt immer noch zu 123a., obwohl nur der a. Teil gefunden wurde. Um nur Aufzählungszeichen in einer Zeile zuzulassen, fügen Sie 01 hinzu(Java-String erneut) am Anfang des Ausdrucks, was bedeutet, dass die Übereinstimmung entweder am Anfang des Textes oder nach einem Zeilenumbruch beginnen muss.

+0

In diesem Beispiel hätte das '\ s' die neue Zeile vor' 10' gefunden. –

+0

@Tim du hast Recht, ich werde das Beispiel aktualisieren. – Thomas

1

eine einfachere regex (nicht getestet):

\\s(\\d+)[.)]\\s