gpt4 book ai didi

java - 如何获得两个星号之间的字符串?

转载 作者:行者123 更新时间:2023-12-01 22:19:28 28 4
gpt4 key购买 nike

所以我在看 reddit,想知道他们如何通过星号封装文本来实现粗体和斜体的格式化,所以我尝试在 java 中复制这种效果。我尝试了很多东西,下面的代码是我尝试过的所有内容的打乱/混合/混搭

  public static ArrayList<String> redditReformat(String message) {
ArrayList<String> single = new ArrayList<>();
ArrayList<String> doubl = new ArrayList<>();
ArrayList<String> fin = new ArrayList<>();

if (message.contains("*") && !message.contains("**")) {
ArrayList<Integer> asterisks = new ArrayList<>();

for (int index = message.indexOf("*"); index >= 0; index = message.indexOf("*", index + 1)) {
asterisks.add(index);
}

HashMap<Integer, Integer> patterns = new HashMap<>();
for (int start : asterisks) {
for (int end : asterisks) {
if (start < end) {
if ((start + 1) != end) {
if (!patterns.containsKey(start) && !patterns.containsValue(end)) {
single.add(message.substring(start, end));
patterns.put(start, end);
}
} else {
if (message.charAt(start + 1) == message.charAt(start)) {
if (message.charAt(end + 1) == message.charAt(end)) {

ArrayList<Integer> doubleasterisks = new ArrayList<>();

if (!patterns.containsKey(start) && !patterns.containsValue(end)) {
doubl.add(message.substring(start + 2, end - 1));
if (doubleasterisks.size() < 2) {
doubleasterisks.add(start + end);
} else {
patterns.put(doubleasterisks.get(1), doubleasterisks.get(2));
doubleasterisks.clear();
}
}
}
}
}
}
}
}
}

for (String s : single) {
fin.add(s);
}
for (String d : doubl) {
fin.add(d);
}
return fin;
}

是的,这很困惑,而且可能很可怕,我尝试过简单和复杂的事情,但这并不顺利。该方法还应该返回消息之间的星号,例如“haha *lol*potato”(stackoverflow 格式化星号)

它目前返回“*lol”而不是“*lol*”,并且使用 ** 完成后它不起作用

当有多个封装时,它也会失败。

最佳答案

您可以使用正则表达式模式来查找出现的情况:

String s = "blah *lol* blah";
Pattern pattern = Pattern.compile("\\*([^\\*]*)\\*");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1));
}

打印:

lol

如果您以前没有接触过正则表达式,我强烈建议您了解它们。它们在许多文本提取/文本修改情况下很有用。

表达式:

\\*([^\\*]*)\\*

分割如下:

\\*      match an asterisk (it's escaped with a backslash
because * is a meaningful character in a regular
expression. It has to be double escaped because
backslash is a meaningful character in a Java
string.

( start a capturing group

[^\\*]* match zero or more characters that are not asterisk

) end the capturing group

\\* match another asterisk

(实际上,正则表达式可能无法完美地处理这里的每种情况,因为它们不处理嵌套,例如 *italic **bold***,但可能已经足够好了。“适当的” “解决方案是编写一些词法分析/解析代码,一次获取每个字符并维护状态。对于这种情况,您甚至可能需要回溯,因为不清楚 *** 是否启动了一个斜体或粗体部分,直到您进一步解析。)

如果你想要这个功能,有 lots预先编写的 Markdown 解析器。

关于java - 如何获得两个星号之间的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220642/

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