[英]How can I get a string between 2 asterisks?
因此,我正在查看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***
,但可能已經足夠好了。“正確的”解決方案是編寫一些詞法分析/解析一次包含每個字符並保持狀態的代碼。在這種情況下,您甚至可能需要回溯,因為在進一步解析之前,不清楚***
是以斜體還是粗體顯示。)
如果需要此功能,則有很多預先編寫的Markdown解析器。
編輯:更新為使用Bukkit的ChatColor
常量
正如評論中的人們所說,您可能應該為該任務使用正則表達式。
閱讀一些有關Minecraft聊天格式的信息,似乎為了使
text
變為粗體,您需要像這樣圍繞它:
§ltext§r
。
對於下划線,它類似於:
§ntext§r
。
為了在Java代碼中包含特殊字符,可以使用unicode
\§
。
以下是一些使用正則表達式將單星號替換為下划線並將雙星號替換為粗體的示例代碼:
public static String applyFormatting(String message) {
// BOLD: replace all occurrences of "**text**" with BOLD+"text"+RESET
message = message.replaceAll("\\*\\*([^\\*]*)\\*\\*", ChatColor.BOLD + "$1" + ChatColor.RESET);
// UNDERLINE: replace all occurrences of "*text*" with ITALIC+"text"+RESET
message = message.replaceAll("\\*([^\\*]*)\\*", ChatColor.ITALIC + "$1" + ChatColor.RESET);
return message;
}
不過,這不適用於嵌套格式,例如**This *is* a test**
。
尚未經過Minecraft的測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.