Регулярное выражение для сопоставления цитаты с минимальным количеством слов - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть следующий текст:

Генеральный прокурор Уильям Барр сказал, что объем скомпрометированной информации «ошеломляет» и является крупнейшим нарушением в истории США. «Эта кража не только нанесла значительный финансовый ущерб Эквифакс, но вторгся в частную жизнь многих, миллионов американцев и наложил на них значительные расходы и бремя, поскольку они должны были принять меры, чтобы защитить себя от кражи личных данных », - сказал г-н Барр.

Я хочу сопоставлять текст в цитате, однако цитата должна быть длиной не менее 5 слов, в противном случае ее следует игнорировать.

В настоящее время я использую следующее регулярное выражение:

(?<=[\\“|\\"])[A-Za-z0-9\.\-][A-Za-z\s,:\\’]+(?=[\”|\"])

Однако это будет включите цитату «ошеломляющий», которая составляет всего 1 слово, поэтому ее следует игнорировать.

Я понимаю, что мог бы выполнить sh, повторив эту часть регулярного выражения 5 раз:

[A-Za-z\s,:\\’]+[A-Za-z\s,:\\’]+[A-Za-z\s,:\\’]+[A-Za-z\s,:\\’]+[A-Za-z\s,:\\’]+

Однако мне интересно, есть ли более короткий и более краткий способ добиться этого? Возможно, вынудив \s in [] появиться хотя бы 5 раз?

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Вам необходимо «развернуть» класс символов, вынув из него шаблон сопоставления пробелов и использовать шаблон [<chars>]+(?:\s+[<chars>]+){4,}. Обратите внимание, что здесь не следует использовать обходные пути, потому что " может быть как ведущим, так и конечным маркером, что может привести к нежелательным совпадениям. Вместо этого используйте группу захвата и получите доступ к ее значению через matcher.group(1).

. Вы можете использовать

String regex = "[“\"]([A-Za-z0-9.-][A-Za-z,:’]*(?:\\s+[A-Za-z0-9.-][A-Za-z,:’]*){4,})[”\"]";

См. Демонстрационную версию regex .

Тогда Просто возьмите значение группы 1:

String line = "Attorney General William Barr said the volume of information compromised was “staggering” and the largest breach in U.S. history.“This theft not only caused significant financial damage to Equifax but invaded the privacy of many, millions of Americans and imposed substantial costs and burdens on them as they had to take measures to protect themselves from identity theft,” said Mr. Barr.";
String regex = "[“\"]([A-Za-z0-9.-][A-Za-z,:’]*(?:\\s+[A-Za-z0-9.-][A-Za-z,:’]*){4,})[”\"]";
Matcher m = Pattern.compile(regex).matcher(line);
List<String> res = new ArrayList<>();
while(m.find()) {
    res.add(m.group(1));
}
System.out.println(res);

См. онлайн Java демо .

Детали шаблона

  • [“"] - или "
  • ([A-Za-z0-9.-][A-Za-z,:’]*(?:\\s+[A-Za-z0-9.-][A-Za-z,:’]*){4,}) - Группа 1:
    • [A-Za-z0-9.-][A-Za-z,:’]* - ASCII alphanumeri c или . или - и затем 0+ букв ASCII, ,, :, символов
    • (?:\s+[A-Za-z0-9.-][A-Za-z,:’]*){4,} - четыре или более вхождения
      • \s+ - 1+ пробелов
        • [A-Za-z0-9.-][A-Za-z,:’]* - ASCII alphanumeri c или . или -, а затем 0+ букв ASCII, ,, :, символов
  • [”"] - " или
1 голос
/ 20 февраля 2020

Вам нужно использовать правильное регулярное выражение, соответствующее вашему случаю.

Тот, что во фрагменте кода ниже соответствует тексту в кавычках длиной 5 слов ,

    Pattern pattern = Pattern.compile("“((\\b\\w+\\b)+.?( *)){5,}”", Pattern.DOTALL);

    String input = "Attorney General William Barr said the volume of "+
    "information compromised was “staggering” and the largest breach in"+
     "U.S. history.“This theft not only caused significant financial "+
     "damage to Equifax but invaded the privacy of many, millions of"+
     "Americans and imposed substantial costs and burdens on them as "+
     "they had to take measures to protect themselves from identity theft,” said Mr. Barr.";

    Matcher m = pattern.matcher(input);

    while (m.find()) {
      String s = m.group();
      System.out.print(s);  
    }

Примечание : необходимо установить utf8 флаг для компиляции этих указанных c кавычек, '' и ''. Поэтому вместо javac TheClass.java используйте javac -encoding utf8 TheClass.java!

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