首页 > 解决方案 > 如何将 /n 替换为

  • java中的标签
  • 问题描述

    我有以下形式的字符串

    Hello \n\tHow are you?\n\t

    我想用

    <li>Hello</li> <li>How are you?</li>

    我可以替换/n to <br>使用 message.replaceAll("\\n\\t","<br>");

    但我不确定如何用<li>***</li>标签替换。我试过这个message.replace("/[^\r\n]+/g", "<li>$&</li>");,但它不起作用。

    标签: javaregex

    解决方案


    好吧,你似乎得出了这个结论:

    • <br />嘿,我可以使用标签替换换行符.replace。我概括将字符串输入转换为 HTML 结构,因此必须始终使用替换来完成...
    • 那么如何使用 replace 来制作<li>结构化 HTML 呢?

    这是一个脑残——你做了你不应该做的跳跃。具体来说,一般来说,将非结构化文本转换为结构化 HTML 并不是一个好.replace主意它实际上只是“换行符到 br 标签”的转换,可以用.replace很少的其他方法来完成,只是因为这是一个通常会失败的过度简化,除了那个特定的转换。

    具体来说,您尝试message.replace("/[^\r\n]+/g", "<li>$&</li>")了显然行不通的方法-replace 根本不应用正则表达式-也许您想要replaceAll. 您可能可以尝试使用replaceall来完成这项工作,但这不是一个好主意。这就像一个问题:“你能用爪锤在吐司上涂黄油吗?” - 是的你可以。这并不能证明这是个好主意。如果您想正确操作,只需使用黄油刀,“但它适用于这个爪锤”并不能改变这一事实。

    所以让我们分解一下。

    您真正想要做的是将非结构化但代表结构化数据的输入首先转换为其实际结构然后才将您拥有的结构转换为<li>基于 -tag 的 HTML。换句话说,这是一个两步模型

    1. 将您的输入字符串转换为您认为它具有的结构。
    2. 将该结构转换回您想要的输出。

    每个步骤都有自己适当的解决方案,具体取决于它拥有什么样的结构、输入的格式以及您想要的输出。

    在这种特定情况下,它似乎很简单:结构是“输入由多行组成,由换行符分隔”,所需的输出是“每一行,HTML 转义,作为<ul>HTML 元素中的列表项'。

    所以让我们这样做:

    首先,我们恢复实际的结构化数据。鉴于您的结构是“一堆行”,List<String>听起来像是正确表示这一点的数据类型。因此,我们需要将输入转换为List<String>. 让我们开始吧:

    List<String> myData = Arrays.asList(input.split("\\R"));
    

    然后,您解决了将现在正确结构化的数据转换为所需输出的完全独立的问题,这现在也很容易:

    StringBuilder html = new StringBuilder();
    html.append("<ul>");
    for (String line : myData) {
      html.append("<li>").append(htmlEscape(line)).append("</li>");
    }
    html.append("</ul>");
    return html.toString();
    

    例如,在哪里htmlEscape由 guava 的 HtmlEscaper 提供支持 - 通常,如果您正在做 Web 工作,您的类路径上有一些框架或其他具有此功能的框架。如果你必须自己拥有它,它可能很简单:

    // Ampersand must remain first character.
    private static final String HTML_PROTECTED = "&<>\"'";
    private static final String[] HTML_REPLACEMENTS = {"amp", "lt", "gr", "quot", "apos"};
    
    public String htmlEscape(String s) {
      for (int i = 0; i < HTML_PROTECTED.length(); i++) {
        s = s.replace("" + HTML_PROTECTED.charAt(i), "&" + HTML_REPLACEMENTS[i] + ";");
      }
      return s;
    }
    

    但是,这些框架无疑可以更快地实现这个想法。


    推荐阅读