Извлечь через регулярное выражение в Java - PullRequest
0 голосов
/ 27 апреля 2020

Я написал программу в Java, используя RE для извлечения нескольких сведений.

Код предназначен для извлечения некоторой информации из текстового файла (который после = и перед знаком |), что информация находится в середина {{cite book .....}}

Мой код:

  final String regex = "(?:\\{\\{cite book\\b[^|]*|\\G(?!^))(?=[^}]*}})\\|([^=]+)=([^|}]+)";

    final Pattern pattern1 = Pattern.compile(regex);
    final Matcher matcher1 = pattern1.matcher(wikifile);
    System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++");
    System.out.println("\n BOOK: \n ");



    while (matcher1.find()) {
        if (matcher1.group(1).trim().equals("title")) System.out.println("\n----------------------\n");

        if (matcher1.group(1).trim().equals("title")||matcher1.group(1).trim().equals("first")||matcher1.group(1).trim().equals("last")||matcher1.group(1).trim().equals("auther")||matcher1.group(1).trim().equals("url") || matcher1.group(1).trim().equals("publisher") ||matcher1.group(1).trim().equals("isbn")) {

      System.out.println(matcher1.group(1) + " = " + matcher1.group(2));

    }
    }

Хорошо работает, когда информация состоит из нескольких строк, за исключением случая, когда она находится в одной длинной строке он не извлекает всю информацию, которую я хочу, и я не знаю, в чем причина ..

Как

{{Cite book|url=https://books.google.es/books?id=HuSQGrRY7F4C|title=Ajax Black Book, New Edition (With Cd)|last=Kogent Solutions Inc|first =|publisher = Dreamtech Press|year=2008|isbn=978-8177228380|location=|pages =40}}

Я хочу извлечь (URL, заголовок, последний, первый, издатель, isbn)

но вывод

 BOOK: 

url = https://books.google.es/books?id=husqgrry7f4c

----------------------

title = ajax black book, new edition (with cd)
last = kogent solutions inc

Когда ввод Like

 {{Cite book
|url=https://books.google.es/books?id=HuSQGrRY7F4C
|title=Ajax Black Book, New Edition (With Cd)
|last=Kogent Solutions Inc
|first =
|publisher = Dreamtech Press
|year=2008
|isbn=978-817722838
|location=
|pages =40}} </ref>

Выход выглядит как

 BOOK: 

url = https://books.google.es/books?id=husqgrry7f4c


----------------------

title = ajax black book, new edition (with cd)

last = kogent solutions inc

first  = 

publisher  =  dreamtech press

isbn = 978-817722838

last  =  flanagan

first  =  david

обновление: Я думаю, что есть проблема с шаблоном (регулярное выражение), когда есть Null или нет пробела между = и |, когда элемент NULL как first=| или location=| и это было в одну строку, я не знаю

2- есть ли способ извлечь (url, title, publisger ..et c), используя RE Patron вместо .group(1).trim().equals("title")

спасибо

1 Ответ

0 голосов
/ 27 апреля 2020

Последнее обновление

Regexp для поиска данных только с префиксом {{Cite book и выбора нескольких пар key=value, разделенных символом '|':

(я:? (<= ^ | \ |) ({{Cite \ s <em>книга \ s ) | (\ s * [^ {|} \ =] +) \ s * \ = \ s * ([^ {|}] [] ))

Следующий код демонстрирует это регулярное выражение:

static final int PREFIX_GROUP = 1;
static final int FIELD_NAME_GROUP = 2;
static final int FIELD_VALUE_GROUP = 3;

// .....
String regex = "(?i:(?<=^|\\|)(\\{\\{Cite\\s*book\\s*)|([^{|}\=]+)\\s*\\=\\s*([^{|}]*[ ]*))";
Pattern pattern = Pattern.compile(regex);

String txt = "{{cite book\n | url=https://books.google.es/books?id=HuSQGrRY7F4C\n | \"title\"=Ajax Black Book, New Edition (With Cd)\n | 'last'=Kogent Solutions Inc | fir$$t =| publisher = Dreamtech Press\n|editor_1= \"William Gates III, Jr.\" |some.dashed-field=TestDot.NET|year=2008\n|  isbn=978-8177228380\n|location=\n|key_w/o_value|pages =40|}}";

Matcher match = pattern.matcher(txt);
while (match.find()) {
    if (match.group(PREFIX_GROUP) != null) {
        System.out.println("prefix: " + match.group(PREFIX_GROUP).trim());
    }
    if (match.group(FIELD_NAME_GROUP) != null) {
        String key   = match.group(FIELD_NAME_GROUP).trim();
        String value = match.group(FIELD_VALUE_GROUP).trim();
        System.out.println(key + " = " + value);
    }
}

и производит вывод:

prefix: {{cite book
url = https://books.google.es/books?id=HuSQGrRY7F4C
"title" = Ajax Black Book, New Edition (With Cd)
'last' = Kogent Solutions Inc
fir$$t = 
publisher = Dreamtech Press
editor_1 = "William Gates III, Jr."
some.dashed-field = TestDot.NET
year = 2008
isbn = 978-8177228380
location = 
pages = 40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...