Regex в соответствии с котировкой минимальным количеством слов

SOS:

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

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

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

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

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

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

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

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

Тем не менее, мне интересно , если есть более короткий и лаконичный способ для достижения этой цели? Возможно, заставляя \sин []появляться по крайней мере , в 5 раз?

Благодарность

Wiktor Stribiżav:

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

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

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

Смотрите регулярок демо .

Затем, возьмите значение Группа 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 демо .

детали Pattern

  • [“"]- или"
  • ([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 , буквенно - цифровой или .или , -а затем 0+ из ASCII букв ,, :, символы
    • (?:\s+[A-Za-z0-9.-][A-Za-z,:’]*){4,} - четыре или более вхождений
      • \s+ - 1+ пробелы
        • [A-Za-z0-9.-][A-Za-z,:’]*- ASCII , буквенно - цифровой или .или , -а затем 0+ из ASCII букв ,, :, символы
  • [”"]- "или

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=13405&siteId=1