Регрессия - мутлилин в Java - PullRequest
1 голос
/ 16 марта 2020

У меня есть произвольная строка, например,

String multiline=`
This is my "test" case
with lines
\section{new section}
Another incorrect test"
\section{next section}
With some more "text"
\subsection{next section}
With some more "text1"
`

Я использую LaTeX и хочу заменить цитаты на те, которые используются в книгах - аналогично ,, и ´´ Для этого мне нужно заменить начинающиеся кавычки с \glqq и окончание с \qrqq - для каждой группы, которая начинается с \.?section.

Если я попробую следующее

String pattern1 = "(^\\\\.?section\\{.+\\})[\\s\\S]*(\\\"(.+)\\\")";
Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE);
Matcher m = p.matcher(testString);
System.out.println(p.matcher(testString).find()); //true

while (m.find()) {
  for (int i = 0; i < 4; i++) {
    System.out.println("Index: " + i);
    System.out.println(m.group(i).replaceAll("\"([\\w]+)\"", "\u00AB$1\u00BB"));
  }
}

, я получу как результат на консоли

true
Index: 0
\section{new section}
Another incorrect test"
\section{next section}
With some more «text1»
Index: 1
\section{new section}
Index: 2
«text1»
Index: 3
text1

Мои проблемы с текущим подходом:

  1. Первое правильное совпадение ("text") не найдено. Я предполагаю, что это связано с многопоточностью и неправильной группировкой \section{. Группировка для кавычек должна быть ограничена группой, которая начинается с \section и заканчивается \?.section - как это исправить?
  2. Даже когда текст найден правильно - как получить полную строку с заменами?

1 Ответ

1 голос
/ 16 марта 2020

Вы можете сопоставить все тексты между section и следующим section или концом строки и заменить все "..." строки внутри него «....

Вот фрагмент Java (см. демо ):

String s = "This is my \"test\" case\nwith lines\n\\section{new section}\nAnother incorrect test\"\n\\section{next section}\nWith some more \"text\"\n\\subsection{next section}\nWith some more \"text1\"";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(?s)section.*?(?=section|$)").matcher(s);
while (m.find()) {
    String out = m.group(0).replaceAll("\"([^\"]*)\"", "«$1»");
    m.appendReplacement(result, Matcher.quoteReplacement(out));
}
m.appendTail(result);
System.out.println(result.toString());

Выход:

This is my "test" case
with lines
\section{new section}
Another incorrect test"
\section{next section}
With some more «text»
\subsection{next section}
With some more «text1»

Шаблон означает:

  • (?s) - Pattern.DOTALL опция встроенного флага
  • section - подстрока section
  • .*? - любые 0+ символов, как можно меньше
  • (?=section|$) - положительный заголовок, который требует, чтобы section подстрока или конец строки появлялись сразу справа от текущего местоположения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...