Извлечение строки, группы номеров, следующей строки, группы следующих номеров - PullRequest
1 голос
/ 14 марта 2011

Я новичок в Regex, и я изо всех сил пытаюсь найти решение моей проблемы. У меня есть файл с несколькими записями. Вот пример:

1) Привет, мой бла-бла-бла. Бла-бла, здание 5677 - Дверь 98 бла-бла-бла.

2) Привет, имя моей собаки - бла-бла, дом 36767 и дверь 898900, бла-бла-бла.

3) Привет, бла-бла, корпус 345 DR 898. Бла-бла-благ, корпус 333 - дверь 89797 бла.

Мне нужно извлечь каждый экземпляр номера здания и номера двери из каждой строки. Единственный шаблон, который является постоянным на протяжении каждой записи:

1) Слово «Строительство» присутствует всегда.

2) За «зданием» всегда следует группа целых чисел ... буква "D | d" ... и вторая группа целых чисел (за которыми следует нецелое число).

Все, что я хочу, это вытащить номер здания и номер двери и распечатать на консоли, но у меня возникают проблемы с преобразованием этого в шаблон регулярного выражения. Я использую Java.

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Я думаю, что это должно работать:

Building.+?(\d+).+?[Dd].+?(\d+)

Ваши номера будут в группах 1 и 2.

Building //start by matching "Building"
.+?      //then skip over the least number of characters that allows the match
(\d+)    //then read as many digits as possible and put them in group one
.+?      //then skip over the least number of characters that allows the match
[Dd]     //then match an upper- or lower-case 'D' 
.+?      //then skip over the least number of characters that allows the match
(\d+)    //then read as many digits as possible and put them in group two

Так в Java:

Pattern pat = Pattern.compile("Building.+?(\\d+).+?[Dd].+?(\\d+)");
Matcher matcher = 
pat.matcher("Hello my is blah blah blah. Blah blah Building 5677 - Door 98 blah blah blah. ");
if (matcher.find()) {
   System.out.println(matcher.group(1));
   System.out.println(matcher.group(2));
}

Редактировать

Чтобы извлечь более одного набора чисел из одного входа, как в третьем примере, вы можете использовать

while (matcher.find()) {

Вместо использования if, чтобы найти его только один раз.

0 голосов
/ 14 марта 2011

Regex для поиска номеров зданий -

(?<=Building\\s)[0-9]+

Аналогично для номеров дверей -

(?<=Door\\s)[0-9]+

Чтобы собрать их вместе -

public static void main(String[] args) {
    String inputStr = "Hello my is blah blah blah. Blah blah Building 5677 - Door 98 blah blah blah";

    Pattern patternBuilding = Pattern.compile("(?<=Building\\s)[0-9]+");
    Pattern patternDoor = Pattern.compile("(?<=Door\\s)[0-9]+");
    Matcher matcherBuilding = patternBuilding.matcher(inputStr);
    Matcher matcherDoor = patternDoor.matcher(inputStr);
    if (matcherBuilding.find())
        System.out.println("Building number is " + matcherBuilding.group());
    if (matcherDoor.find())
        System.out.println("Door number is " + matcherDoor.group());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...