HTML 解析器 - 用户输入一些带有自定义标签的文本(BB 和 Markdown 之间的东西,如 [b] 或 [#RRGGBB] ),然后它解析为 HTML - 所以 [#FF-6ren">
gpt4 book ai didi

java - 是否可以使用 "$1"作为另一个方法的参数并将返回的字符串放在 .replaceAll 中的位置?

转载 作者:行者123 更新时间:2023-11-30 07:08:30 29 4
gpt4 key购买 nike

我正在编写 tag->HTML 解析器 - 用户输入一些带有自定义标签的文本(BB 和 Markdown 之间的东西,如 [b][#RRGGBB] ),然后它解析为 HTML - 所以 [#FF0000]red text[/#]变成 <span style='color:#FF0000;'>red text</strong>然后以HTML样式放入JTextPane中。

所有用户标签和 HTML 都存储在 HashMap 中并像这样解析:

public static String parseBBToHTML(String text) {
String html = text;

Map<String,String> bbMap = new HashMap<String , String>();

bbMap.put("\\[b\\]", "<strong>");
bbMap.put("\\[/b\\]", "</strong>");
...
bbMap.put("\\[color=(.+?)\\]", "<span style='color:$1;'>");
bbMap.put("\\[/color\\]", "</span>");

for (Map.Entry entry: bbMap.entrySet()) {
html = html.replaceAll(entry.getKey().toString(), entry.getValue().toString());
}

return html;
}

然后用其他方法返回用于 JTextPane 中的 .setText() 的值,并带有动画效果,只需逐个输入字母并在它们之间暂停即可。

一切都很好,但现在我在想一件事:

我正在用空 HTML 标签模仿打字动画的暂停,如下所示:<!!!!!!!!!!>

所以 10 个“!”它们之间有 20 毫秒的暂停,给我 200 毫秒的暂停。我用这个方法形成“暂停标签”(它的参数是 int,但你会明白为什么我现在使用 String):

public static String pause(String ms){
String pausedText = "";
int time = Integer.parseInt(ms);
for (int i = 0; i < (time/animationSpeed); i++) {
pausedText = pausedText + "!";
}
return "<"+pausedText+">";
}

我想使用像 [!2000] 这样的标签暂停至 2000 毫秒。所以我只是像这样输入我的解析器字符串:

bbMap.put("\\[\\!(.+?)\\]", Dialogue.pause("$1"));

...但它不起作用。它在 Dialogue.pause 方法中给出字面上字符串“$1”,而不是 $1作为解析值。

如何使用$1作为形成“暂停标签”的参数并将其放置在文本中?

最佳答案

字符串只是一个单一的静态值。您想要的是一个从另一个字符串动态计算得到的字符串。

您需要更改您的 map :

Map<String, String> bbMap = new HashMap<String, String>();

对此:

Map<String, UnaryOperator<String>> bbMap = new HashMap<>();

一个UnaryOperator<String>是一个接受 String 参数并返回 String 值的函数。因此,您可以像这样填充您的 map :

bbMap.put("\\[b\\]", s -> "<strong>");
bbMap.put("\\[/b\\]", s -> "</strong>");
//...
bbMap.put("\\[color=(.+?)\\]", s -> "<span style='color:" + s + ";'>");
bbMap.put("\\[/color\\]", s -> "</span>");

bbMap.put("\\[\\!(.+?)\\]", s -> Dialogue.pause(s));

for (Map.Entry entry : bbMap.entrySet()) {
StringBuffer buffer = new StringBuffer(html.length());

Matcher matcher =
Pattern.compile(entry.getKey().toString()).matcher(html);
while (matcher.find()) {
String match =
(matcher.groupCount() > 0 ? matcher.group(1) : null);
String replacement = entry.getValue().apply(match);
matcher.appendReplacement(buffer,
Matcher.quoteReplacement(replacement));
}
matcher.appendTail(buffer);

html = buffer.toString();
}

关于java - 是否可以使用 "$1"作为另一个方法的参数并将返回的字符串放在 .replaceAll 中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39617664/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com