поиск регулярных выражений в Java - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь сопоставить любой список в произвольном текстовом документе.Списки маркеров определяются как любые цифры или строчные буквы, перед которыми стоит разделитель слов.Так, например,

1.  item a
2.  item b

Я использую следующий код для поиска маркеров:

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

Это работает хорошо, пока список маркеров состоит из однозначных элементов.Однако, как только я попробую несколько списков маркеров с цифрами, это не будет работать (пример 12. item c 13. item d), я попытался изменить шаблон на

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

или

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

MyИнтерпретация языка регулярных выражений заключается в том, что это будет соответствовать любому случаю, когда перед «.» стоит 1 или более цифр.Но это не работает.

Кто-нибудь может увидеть, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

более простое регулярное выражение (не проверено):

\\s(\\d+)[.)]\\s
1 голос
/ 02 апреля 2012
Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s");

(ваша вторая версия) должна работать, но вы можете упростить ее:

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

Однако, она ожидает пробел перед цифрой (поэтому она не будет совпадать в началестрока, например).Возможно, граница слова здесь полезна:

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

(к вашему сведению: ваш третий пример пытался сопоставить литерал + после одной цифры. Вот почему это не удалось).

0 голосов
/ 02 апреля 2012

Полагаю, проблема в том, что перед цифрами не всегда есть пробел. Таким образом измените выражение на (строковая версия Java) "\\s*\\d+[\\.\\)]\\s".

Пример:

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

Что касается строчной буквы:

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

, где (?:\\d+|[a-z]+) означает «последовательность цифр или символов нижнего регистра.

Обратите внимание, что это все равно будет соответствовать 123a., даже если будет совпадать только часть a.. Чтобы разрешить использование только маркеров в строке, добавьте "(?:^|\\n)" (снова строку Java) в начале выражения, что означает, что совпадение должно начинаться либо в начале текста, либо после разрыва строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...