扫描字符串并返回有界文本

时间:2012-08-27 17:49:28

标签: android string-parsing

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

我已启动并运行此功能 - 我现在正尝试在定义之间添加动态链接。

示例:假设用户点击列表中的项目“dog”。可能会出现这样的定义:“小毛茸茸的[动物],通常作为宠物饲养。另见[猫]。”目的是用户可以单击[animal]或[cat]一词并转到相应的定义。我已经解决了确保定义中的任何链接都用方括号限制的麻烦,所以这只是扫描弹出字符串中的文本[括号括起来]并提供指向该定义的链接。 / p>

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

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

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

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

我是Java的新手 - 我来自MATLAB,我只是维持下去,但这是一项不太常见的任务,而不是我到目前为止所处理的任务!

2 个答案:

答案 0 :(得分:0)

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

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

一些提示:

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

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

答案 1 :(得分:0)

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

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

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

然后,您可以浏览输入以查找此模式的匹配项。第一个匹配组未更改,第二个匹配组将转换为链接。当模式停止匹配您的输入时,将剩下的任何内容都移除并传输不变的。

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

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

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