gpt4 book ai didi

java - 使用java和Android提取bbcode引用但不提取引用标签内的内容

转载 作者:行者123 更新时间:2023-12-01 13:46:45 27 4
gpt4 key购买 nike

我打算提取带有引号的 bbcode,但在实际输出出现时却无济于事。

我想实现 bbcode 解析模块来提取引号作为所需的输出。引号的数量应该是递归方法或其他方法..

INput : 

Testing [quote]http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url] [/quote] Testing

Desired Output

测试 http://www.yourube.com?watch?v=asasdsadsa [url]亚洲[/url] 艾萨测试

Actual Output:

http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url]
http://www.yourube.com?watch?v=asasdsadsa aisa

下面是我的代码

        String s = "[quote]http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url][/quote]";
String t = bbcode(s);
System.out.println(t);
String u = bbcode2(t);
System.out.println(u);

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

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


bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "$1");


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

return html;
}

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

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



bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "$1");

bbMap.put("\\[url\\](.+?)\\[/url\\]", "$1");

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

return html;
}

最佳答案

这是匹配 BB 代码标记对的通用 Java 正则表达式:

\\[([^\\]]+)\\](.+?)\\[/\\1\\]

这将获取顶级比赛,例如在 [a][b] hi [/b] hello [/a][c] yo [/c] 中,第 2 组将匹配 [b] hi [\b] helloyo。 (Demonstrated here)

<小时/>

我认为任何正则表达式解决方案都要求您使用递归(正则表达式之外)来查找所有匹配项。您将必须找到所有顶级匹配项(将它们添加到某个数组中),然后在每个匹配项上递归地使用相同的正则表达式(将它们全部添加到同一个结果数组中),直到最终没有匹配项可以找到更多匹配项.

在该示例中,您可以看到需要在 [b] hi [\b] hello 上再次运行正则表达式以返回 [b] hi [/b] 这是

例如,对于输入:

[A] outer [B] [C] last one left [/C] middle [/B] [/A]  [A] out [B] in [/B] [/A]

首先,针对该字符串运行正则表达式并查看第 2 组匹配:

outer [B] [C] last one left [/C] middle [/B]
out [B] in [/B]

将它们添加到结果数组中,然后针对这些匹配运行正则表达式并得到:

 [C] last one left [/C] middle
in

将它们添加到结果数组中,然后再次针对这些匹配项运行它并获取:

 last one left
[no matches]

最后,您将针对剩下的最后一个运行它,并且不再获得匹配项,所以您就完成了。

Raju,如果您不熟悉递归,那么此时停止阅读并尝试自己解决问题对您非常有益 - 如果您放弃,请回来。也就是说...

<小时/>

这个问题的Java解决方案是:

public static void getAllMatches(Pattern p, String in, List<String> out) {
Matcher m = p.matcher(in); // get matches in input
while (m.find()) { // for each match
out.add(m.group(2)); // add match to result array
getAllMatches(p, m.group(2), out); // call function again with match as input
}
}

And here is a working example on ideone

ideone 输出:

[A]outer[B][C]last one left[/C]middle[/B][/A] [A]out[B]in[/B][/A]
-----------
- outer[B][C]last one left[/C]middle[/B]
- [C]last one left[/C]middle
- last one left
- out[B]in[/B]
- in

[quote]http://www.yourube.com?watch?v=asasdsadsa [url]aisa[/url] [/quote]
-----------
- http://www.yourube.com?watch?v=asasdsadsa [url]aisa[/url]
- aisa

关于java - 使用java和Android提取bbcode引用但不提取引用标签内的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313496/

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