接近一个大的正则表达式问题

时间:2014-06-10 02:22:58

标签: java regex

好的,所以我有这个问题,我需要创建一个具有构造函数来接受字符串的类,一个名为add的方法,它接受一个String-Object对,其中name是占位符名称和一个名为render的方法它使用add中给出的对替换模板中的占位符。

所有这些都需要能够毫无问题地完成以下测试。

@Test
    public void testString() {
        View view = new View("Hi, my name is {name}!");
        view.add("name", "Josh");
        Assert.assertEquals("Hi, my name is Josh!", view.render());
    }

    @Test
    public void testList() {
        View view = new View("<table>{rows}</table>");
        view.add("rows", Arrays.asList("<tr><td>Louis</td><td>Armstrong</td></tr>", "<tr><td>Benny</td><td>Goodman</td></tr>"));
        Assert.assertEquals("<table><tr><td>Louis</td><td>Armstrong</td></tr><tr><td>Benny</td><td>Goodman</td></tr></table>", view.render());
    }

    @Test
    public void testView() {
        View view = new View("<table>{rows}</table>");

        View row1 = new View("<tr><td>{firstName}</td><td>{lastName}</td></tr>");
        row1.add("firstName", "Louis");
        row1.add("lastName", "Armstrong");
        View row2 = new View("<tr><td>{firstName}</td><td>{lastName}</td></tr>");
        row2.add("firstName", "Benny");
        row2.add("lastName", "Goodman");

        view.add("rows", Arrays.asList(row1, row2));
        Assert.assertEquals("<table><tr><td>Louis</td><td>Armstrong</td></tr><tr><td>Benny</td><td>Goodman</td></tr></table>", view.render());
    }

唯一的问题是我根本不知道如何解决这个问题。任何人都可以给我一个正确的推动方向吗?

2 个答案:

答案 0 :(得分:2)

由于这似乎是,我不会提供完整的解决方案,但根据要求,我会提供一些一般性的考虑/提示。


以第一个测试用例为例:

  • View构造函数的参数/参数捕获为成员变量。我们将调用该成员变量text

  • 捕获提供给add的每个键值关系。通常,这将使用Mapping数据结构来完成。如果您无法使用该选项,则可以随时通过每次调用text直接修改add

  • 执行render的替换。这很容易通过replace method完成。如果在text中修改了add,则只需将其返回。

所有这些都没有将这些实现细节包装到View类中,它看起来像

@Test
public void testString() {
    String text = "Hi, my name is {name}!";

    final Map<String, String> placeHolderToReplacement = new HashMap<>();
    placeHolderToReplacement.put("name", "Josh");

    for (Map.Entry<String, String> entry : placeHolderToReplacement.entrySet()) {

      text = text.replace("{"+entry.getKey()+"}", entry.getValue());

    }

    Assert.assertEquals("Hi, my name is Josh!", text); 
}

我认为应该给你足够的起点来解决问题。

现在,帖子明确指出String-Object pair。它必须是采用add对象集合和View的完全相同的String方法吗?您必须考虑是否提供overloaded方法与单一方法是否可接受。如果它必须是相同的方法,那么你需要自己进行类型检查。

答案 1 :(得分:0)

public class View {
    private String v;
    public View(String v) {
        this.v = v;
    }
    public void add(String key, String value) {
        v = v.replaceAll("{" + key + "}", value);
    }

    public String render() {
        return v;
    }
}