REGEX жадность или просто неправильный синтаксис - PullRequest
1 голос
/ 22 мая 2019

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

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

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

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

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

ИтакЯ получил:

569   2731

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

1 Ответ

1 голос
/ 22 мая 2019

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

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

См. Демоверсию regex

Детали

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