2

我正在编写一个字典类型的应用程序。我有一个哈希映射术语和定义的列表。基本前提是有一个单词列表,您可以点击以查看定义。

我已经启动并运行了这个功能 - 我现在正在尝试在定义之间放置动态链接。

示例:假设用户点击列表中的一个项目,“狗”。定义可能会弹出,说“一种小毛茸茸的[动物],通常作为宠物饲养。另见[猫]。”。目的是用户可以单击单词 [animal] 或 [cat] 并转到适当的定义。我已经费心确保定义中的任何链接都以方括号为界,因此只需扫描弹出字符串中的文本[用括号括起来]并提供指向该定义的链接。

请注意,定义可以包含多个链接,而有些定义不包含任何链接。

我可以在字符串显示之前访问它,所以我想最好的方法是在显示对话框之前进行扫描并准备好链接。

问题是,我将如何扫描被方括号包围的文本,并返回包含在这些括号中的文本?

理想情况下,实际显示的对话框应该没有方括号,而且我还需要找出一种将超链接放入对话框文本的方法,但是当我谈到它时,我会越过那座桥。

我是 Java 新手——我来自 MATLAB,只是为了维持生计,但这是一项比我迄今为止必须处理的任务更不常见的任务!

4

2 回答 2

0

很简单,我认为...由于文本在括号中,您需要扫描每个字母。所以基本配方是:

  • while循环中扫描每个字符(比方说,while i < len(text)
  • 如果扫描的字符是[
    • i++;
    • 将索引处的字母添加i到一些临时变量
    • while (character @ i) != ']'将其附加到临时变量
    • 将此临时变量存储在结果列表中。

一些技巧:

  • 如果您使用上述解决方案,请使用StringBuilder附加文本(因为常规string是不可变的)
  • 您可能还希望(我认为这更好)首先存储所有方括号的开始结束位置,然后string.substring()在每一对上使用以获取里面的文本。这样,您首先迭代定义以查找括号(可能会捕获不匹配的括号,以进行早期错误处理),然后迭代索引对...

至于链接,也许这会有用:How can I get clickable hyperlinks in AlertDialog from a string resource?

于 2012-08-27T17:59:03.030 回答
0

您可能可以使用正则表达式来做到这一点;像这样的东西:

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

它描述了两个“匹配组”;第一个表示任何零个或多个不是“[”的字符的字符串,第二个表示任何以“[”开头的字符串,包含一个或多个不是“]”的字符,并以“ ]”。

然后您可以扫描您的输入以查找与该模式匹配的内容。第一个匹配组不变通过,第二个匹配组转换为链接。当模式停止匹配您的输入时,取出剩下的任何内容并保持原样传输。

您必须进行一些实验;正则表达式通常需要一些调试。如果您的链接文本只能包含字母数字和空格,则您的模式看起来更像这样:

([^[]*)(\[[\s\w]+\])

另外,你可能会发现Android下的正则表达式匹配太慢了,不实用,这种情况下你就不得不使用wasyl的建议了。

于 2012-08-27T21:52:51.677 回答