Java RegEx Fun - игра с предложениями - PullRequest
0 голосов
/ 08 сентября 2011

Входная строка:

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("(\\. |\\.&nbsp;|\\?|\\])").matcher(paragraph.toString());

   return m.replaceAll("$1<br /><br />");

}

Это дает мне желаемый результат.Однако есть одна проблема: если есть промежуток между # __ # (пример: # Миссис Смит пинает мисс Смит в чувствительном месте # ), строка input.split("\\."); будетразбить # __ #.Поэтому я заменю строку input.split() на RegEx.

1 Ответ

2 голосов
/ 08 сентября 2011

Скелет, который я бы использовал, выглядит следующим образом:

String computeForSlashline(String input) {

    String[] sentences = input.split("\.");
    for(int i = 0; i < sentences.length; i++) {
        // perform a search on each sentence, moving the #__# to the front
    }
    StringBuilder sb = new StringBuilder();
    for(String sentence : sentences) {
        sb.append(sentence).append(". ");
    }
    return sb.toString().trim();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...