我正在编写代码来创建Java模板库。我正在编写一段特定的代码,读者可以阅读模板文本并拉出占位符(“ $ {placeholder})。到目前为止,当进行Jtesting时,它似乎可以使用单个占位符,但是当我尝试时不止一个,这些代码似乎并没有环回并读取模板的其余部分。
我一生都无法看到代码失败的原因。
我已经调试了代码,我所看到的是,当它存储了第一个占位符时,它并没有环回,而是退出了。
代码如下:
import java.io.IOException;
import java.io.Reader;
public class placeholderFinder {
private Reader reader;
public placeholderFinder(Reader reader) {
this.reader = reader;
}
public static final int NORMALTEXT = 0;
public static final int PLACEHOLDERTEXT = 1;
private int state = NORMALTEXT;
private StringBuilder placeholder = new StringBuilder();
public String nextPlaceholderFinder() throws IOException {
for (int p = reader.read(); p != -1; p = reader.read()) {
if (p == '$') {
if (state == NORMALTEXT) {
state = PLACEHOLDERTEXT;
placeholder.append((char) p);
}
} else if (state == PLACEHOLDERTEXT) {
placeholder.append((char) p);
}
if (p == '}') {
if (state == PLACEHOLDERTEXT) {
state = NORMALTEXT;
String placeholderStore = placeholder.toString();
placeholder.setLength(0);
return placeholderStore;
}
}
}
return null;
}
}
还有Jtest
@Test
void testWithPlaceholders() throws IOException {
Reader reader = new StringReader("a ${name} ${date}");
placeholderFinder finder = new placeholderFinder(reader);
String expectedresult = "${name}${date}";
String actualcode = finder.nextPlaceholderFinder();
assertEquals(expectedresult, actualcode);
答案 0 :(得分:0)
之所以只找到一个占位符(例如${name}
),是因为一旦找到}
符号,您就必须做一个return语句。
在这一行:
return placeholderStore;
尝试将第一个占位符的临时结果放入列表,如下所示:
List<String> results = new ArrayList<String>();
而不是返回占位符存储,而是将其放置在列表中:
results.add(placeholderStore);
当您阅读了整个文本(无论实际包含什么内容)后,您将返回此结果列表(并更改方法的返回类型)。或者您再次加入列表:
String.join("", results);
答案 1 :(得分:0)
找到第一个占位符后,您当前的解决方案将返回,您可以对其进行更改以遍历reader
中的所有字符,然后再返回。这是一个示例:
public String nextPlaceholderFinder() throws IOException {
for (int p = reader.read(); p != -1; p = reader.read()) {
if (p == '$') {
if (state == NORMALTEXT) {
state = PLACEHOLDERTEXT;
placeholder.append((char) p);
}
} else if (state == PLACEHOLDERTEXT) {
placeholder.append((char) p);
}
if (p == '}') {
if (state == PLACEHOLDERTEXT) {
state = NORMALTEXT;
}
}
}
return placeholder.toString();
}