Входная строка:
Lorem ipsum tip.Lorem ipsum loprem ipsum septum # соответствует этому # , lorem ipsum # соответствует этому # .# Не соответствует этому, потому что это уже после периода #.
Желаемый результат:
Lorem ipsum tip. # сопоставить это # # сопоставить это тоже # Lorem ipsum loprem ipsum перегородка, lorem ipsum.# Не соответствует этому, потому что это уже после периода #.
Обратите внимание, что # соответствует этому # и # соответствуют этому тоже # оба былиперенесено рядом с самым последним периодом (.).Проще говоря, все, что является ## , должно быть перемещено в ближайший период слева.
Может ли обработка RegEx и Java String достичь этого?
Это самый простой RegExчтобы соответствовать # что-нибудь # вот это:
\#(.*?)\#
У меня возникли трудности за пределами этого.
Редактировать: Вы не должны говорить мне, как написать полную программу.Мне просто нужно достаточное решение RegEx, и тогда я сам попробую манипулировать строками.
Вот мое решение, полученное из ответа glowcoder :
public static String computeForSlashline(String input) {
String[] sentences = input.split("\\.");
StringBuilder paragraph = new StringBuilder();
StringBuilder blocks = new StringBuilder();
Matcher m;
try {
// Loop through sentences, split by periods.
for (int i = 0; i < sentences.length; i++) {
// Find all the #____# blocks in this sentence
m = Pattern.compile("(\\#(.*?)\\#)").matcher(sentences[i]);
// Store all the #____# blocks in a single StringBuilder
while (m.find()) {
blocks.append(m.group(0));
}
// Place all the #____# blocks at the beginning of the sentence.
// Strip the old (redundant) #____# blocks from the sentence.
paragraph.append(blocks.toString() + " " + m.replaceAll("").trim() + ". ");
// Clear the #____# collection to make room for the next sentence.
blocks.setLength(0);
}
} catch(Exception e) { System.out.println(e); return null; }
// Make the paragraph look neat by adding line breaks after
// periods, question marks and #_____#.
m = Pattern.compile("(\\. |\\. |\\?|\\])").matcher(paragraph.toString());
return m.replaceAll("$1<br /><br />");
}
Это дает мне желаемый результат.Однако есть одна проблема: если есть промежуток между # __ # (пример: # Миссис Смит пинает мисс Смит в чувствительном месте # ), строка input.split("\\.");
будетразбить # __ #.Поэтому я заменю строку input.split()
на RegEx.