Avatar billede andersdp Nybegynder
28. august 2003 - 10:42 Der er 9 kommentarer og
1 løsning

Erstatte enter med linieskift i String

Hey.

Jeg skal bruge en funktion der erstatter enter i en String, med et linieskift. Det skal se ordentlig ud, når det trækkes ud fra db'en igen...

Jeg har bl.a. forsøgt med:
String beskrivelse = b.replace('\n','<br>');

Men det spiller ikke rigtig...
Nogen der har en løsning?
Avatar billede arne_v Ekspert
28. august 2003 - 10:52 #1
'<br>' er ikke en valid char.

Hvis du bruger Java SDK 1.4 eller nyere kan du bruge:

String beskrivelse = b.replaceAll("\n","<br>");
Avatar billede arne_v Ekspert
28. august 2003 - 10:52 #2
Skulle have været et svar.
Avatar billede arne_v Ekspert
28. august 2003 - 10:53 #3
Hvis du bruger ældre SDK så har jeg replace all kode til den.
Avatar billede andersdp Nybegynder
28. august 2003 - 10:54 #4
Jeg bruger jdk1.3.1_06
Avatar billede arne_v Ekspert
28. august 2003 - 11:17 #5
Vi havde for godt et halvt år siden en stor tråd om replaceAll
performance.

Her er mit program til det:

public class ReplaceTest {
  private final static int N = 10000;
  public static void main(String[] args) {
      test(new ReplaceRecursiveString());
      test(new ReplaceSmartRecursiveString());
      test(new ReplaceRecursiveStringBuffer());
      test(new ReplaceRecursiveGlobalStringBuffer());
      test(new ReplaceLoopString());
      test(new ReplaceLoopStringBuffer());
      return;
  }
  private static void test(Replacer r) {
      verify(r);
      perf(r);
      return;
  }
  private static void verify(Replacer r) {
      if (!r.replaceAll("123<P>456<P>789", "<P>", "\n").equals("123\n456\n789")
        || !r.replaceAll("<P>123<P>456<P>789<P>", "<P>", "\n").equals("\n123\n456\n789\n")
        || !r.replaceAll("123<P><P>456", "<P>", "\n").equals("123\n\n456")
        || !r.replaceAll("<P>", "<P>", "\n").equals("\n")
        || !r.replaceAll("", "<P>", "\n").equals("")) {
        System.out.println(r.getMethod() + " failed");
      }
      return;
  }
  private static void perf(Replacer r) {
      System.out.println(r.getMethod() + ":");
      perf("short text - few replaces", r, 1000, 5);
      perf("short text - many replaces", r, 1000, 25);
      perf("long text - few replaces", r, 10000, 5);
      perf("long text - many replaces", r, 10000, 25);
      return;
  }
  private static void perf(String title, Replacer r, int txtlen, int nrepl) {
      StringBuffer sb = new StringBuffer("");
      for (int i = 0; i < txtlen; i++) {
        sb.append('A');
        if ((i % (txtlen / nrepl)) == 0) {
            sb.append("<P>");
        }
      }
      perf(title, r, sb.toString());
      return;
  }
  private static void perf(String title, Replacer r, String s) {
      long t1 = System.currentTimeMillis();
      for (int i = 0; i < N; i++) {
        r.replaceAll(s, "<P>", "\n");
      }
      long t2 = System.currentTimeMillis();
      System.out.println(title + " = " + (t2 - t1));
      return;
  }
}
interface Replacer {
  public String getMethod();
  public String replaceAll(String s, String s1, String s2);
}
class ReplaceRecursiveString implements Replacer {
  public String getMethod() {
      return "Recursive with String";
  }
  public String replaceAll(String s, String s1, String s2) {
      int ix = s.indexOf(s1);
      if (ix >= 0) {
        return replaceAll(s.substring(0, ix) + s2 + s.substring(ix + s1.length()), s1, s2);
      } else {
        return s;
      }
  }
}
class ReplaceSmartRecursiveString implements Replacer {
  public String getMethod() {
      return "Smart recursive with String";
  }
  public String replaceAll(String s, String s1, String s2) {
      int ix = s.indexOf(s1);
      if (ix >= 0) {
        return (s.substring(0, ix) + s2 + replaceAll(s.substring(ix + s1.length()), s1, s2));
      } else {
        return s;
      }
  }
}
class ReplaceRecursiveStringBuffer implements Replacer {
  public String getMethod() {
      return "Recursive with StringBuffer";
  }
  public String replaceAll(String s, String s1, String s2) {
      int ix = s.indexOf(s1);
      if (ix >= 0) {
        StringBuffer tmp = new StringBuffer("");
        tmp.append(s.substring(0, ix));
        tmp.append(s2);
        tmp.append(s.substring(ix + s1.length()));
        return replaceAll(tmp.toString(), s1, s2);
      } else {
        return s;
      }
  }
}
class ReplaceRecursiveGlobalStringBuffer implements Replacer {
  public String getMethod() {
      return "Recursive with global StringBuffer";
  }
  public String replaceAll(String s, String s1, String s2) {
      StringBuffer tmp = new StringBuffer("");
      replaceAllHelp(tmp, s, s1, s2);
      return tmp.toString();
  }
  private void replaceAllHelp(StringBuffer res, String s, String s1, String s2) {
      int ix = s.indexOf(s1);
      if (ix >= 0) {
        res.append(s.substring(0, ix));
        res.append(s2);
        replaceAllHelp(res, s.substring(ix + s1.length()), s1, s2);
      } else {
        res.append(s);
      }
      return;
  }
}
class ReplaceLoopString implements Replacer {
  public String getMethod() {
      return "Loop with String";
  }
  public String replaceAll(String s, String s1, String s2) {
      String tmp = new String("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = s.indexOf(s1, pos);
        if (ix >= 0) {
            tmp = tmp + s.substring(pos, ix) + s2;
            pos = ix + s1.length();
        } else {
            tmp = tmp + s.substring(pos);
            pos = s.length();
        }
      }
      return tmp;
  }
}
class ReplaceLoopStringBuffer implements Replacer {
  public String getMethod() {
      return "Loop with StringBuffer";
  }
  public String replaceAll(String s, String s1, String s2) {
      StringBuffer tmp = new StringBuffer("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = s.indexOf(s1, pos);
        if (ix >= 0) {
            tmp.append(s.substring(pos, ix));
            tmp.append(s2);
            pos = ix + s1.length();
        } else {
            tmp.append(s.substring(pos));
            pos = s.length();
        }
      }
      return tmp.toString();
  }
}
Avatar billede arne_v Ekspert
28. august 2003 - 11:19 #6
Hvis du tager den sidste og laver den static:

  public static String replaceAll(String s, String s1, String s2) {
      StringBuffer tmp = new StringBuffer("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = s.indexOf(s1, pos);
        if (ix >= 0) {
            tmp.append(s.substring(pos, ix));
            tmp.append(s2);
            pos = ix + s1.length();
        } else {
            tmp.append(s.substring(pos));
            pos = s.length();
        }
      }
      return tmp.toString();
  }

så kan du bare kalde den metode.
Avatar billede arne_v Ekspert
28. august 2003 - 11:20 #7
String beskrivelse = replaceAll(b, "\n", "<br>");
Avatar billede andersdp Nybegynder
28. august 2003 - 11:31 #8
Jeg er desværre ikke nogen java haj, og min kammerat der normalt klarer den slags er på ferie.... Men han kan nok hurtigt implementere din metode...

Jeg var bare på udkig efter en nem metode at erstatte \n med <br> lige inden jeg smider det i db'en... Men jeg kan godt se at <br> ikke accepteres - kan det ikke omskrives så det accepteres?

Men hvis det ikke kan klares uden en java metode, må jeg vente nogle dage på afklaring...
Avatar billede arne_v Ekspert
28. august 2003 - 11:42 #9
<%!
public static String replaceAll(String s, String s1, String s2) {
      StringBuffer tmp = new StringBuffer("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = s.indexOf(s1, pos);
        if (ix >= 0) {
            tmp.append(s.substring(pos, ix));
            tmp.append(s2);
            pos = ix + s1.length();
        } else {
            tmp.append(s.substring(pos));
            pos = s.length();
        }
      }
      return tmp.toString();
  }
%>

og:

String beskrivelse = replaceAll(b, "\n", "<br>");

et sted inden i <% %> skulle gøre det.
Avatar billede andersdp Nybegynder
28. august 2003 - 11:45 #10
Det gjorde det - mange tak for hjælpen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester