Java RegEx Fun - 玩句子

时间:2011-09-07 21:43:40

标签: java regex

输入字符串:

  

Lorem ipsum小贴士。 Lorem ipsum loprem ipsum septum #match this#,   lorem ipsum #match这个#。 #不要匹配,因为它是   已经过了一段时间#。

期望的输出:

  

Lorem ipsum小贴士。 #匹配##匹配这个# Lorem ipsum   loprem ipsum septum,lorem ipsum。 #不要匹配,因为它是   已经过了一段时间#。

请注意 #match此# #match这个#都已移动到最近一段时间(。)旁边。基本上, ## 的所有内容都应该移到左边最近的时段。

RegEx和Java String处理能否实现这一目标?

这个与 #anything#匹配的最基本的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 />");

}

这给了我想要的输出。但是有一个问题:如果在# __#之间有一段时间(例如: #Mrs.Smith在敏感点#中踢史密斯女士),{{1} }行将分解#__ #。所以我将用RegEx替换input.split("\\.");行。

1 个答案:

答案 0 :(得分:2)

我将使用的骨架如下:

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();

}