REGEX жадность или просто неправильный синтаксис

Я попытался удалить все [.!?] из кавычек в тексте, и при этом я хочу сначала поймать все мои кавычки, включая [.!?], с регулярным выражением, чтобы удалить их после этого.

Мое регулярное выражение не работает, может быть, потому что оно жадное. Он берет от моего ««» (символ с индексом 569) до последнего символа, который является еще одним «»» (символ с индексом 2730).

Мое регулярное выражение было:

Pattern full=Pattern.compile("«.*[.!?].*?»");

Matcher mFull = full.matcher(result);
while(mFull.find()){
    System.out.println(mFull.start()+"  "+mFull.end());
}

Итак, я получил:

569   2731

Кроме того, та же проблема жадности с предложениями ловли (начиная с любого [A-Z] и заканчивая любым [.!?].

Чтобы кто-то мог помочь вам в этом, я бы рекомендовал вам опубликовать входную строку и желаемый результат.

Mena 22.05.2019 11:09

Вы, должно быть, ищете что-то вроде s.replaceAll("(\\G(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "$1$2")

Wiktor Stribiżew 22.05.2019 11:14

Вау, я не очень хорошо разбираюсь в регулярных выражениях, не могли бы вы объяснить это?

Benech17 22.05.2019 11:17

Я объяснил в отвечать.

Wiktor Stribiżew 22.05.2019 11:21
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

s = s.replaceAll("(\\G(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "$1$2");

См. демонстрация регулярных выражений

Подробности

  • (\G(?!^)|«) - Группа 1 (значение которой обозначено $1 из шаблона замены): либо конец предыдущего совпадения, либо «
  • ([^«».!?]*) - Группа 2 ($2): любые символы 0+, кроме «, », !, . и ?
  • [.!?] - любой из трех символов
  • (?=[^«»]*») - должен быть » после 0 или более символов, кроме « и » сразу справа от текущего местоположения.

Спасибо за вашу помощь ! это работает отлично! Могу ли я спросить вас слишком много, если я спрошу вас, каким должно быть регулярное выражение, если я хочу поймать предложение A (начинающееся с [A-Z] и заканчивающееся [.!?] , у меня та же проблема жадности. Спасибо!

Benech17 22.05.2019 11:26

@ Benech17 Пожалуйста, имейте в виду, что регулярное выражение не знает грамматики естественного языка. Если вы используете шаблон (?s)(?:^|[.?!])\s*(A.*?[?!.]), он может работать в большинстве случаев, но не работает, когда предложение содержит аббревиатуру, например. Another U.S. military base was deployed.

Wiktor Stribiżew 22.05.2019 11:29

Да, я знаю это, но я бы сделал предварительную обработку своего текста, чтобы «распознать» эту аббревиатуру и т. д.

Benech17 22.05.2019 11:33

Другие вопросы по теме