如何确定两个长度不同的字符串之间的同一字符集的索引?

时间:2015-06-08 20:31:13

标签: c# arrays regex string

我在前面为标题道歉,我不确定如何说出问题。

我试图在两个不同但相似的字符串中找到类似字符或字符集的索引。

  • 字符串A:I <color=red><b>really</b></color> don't like spiders!
  • 字符串B:I really don't like spiders!

相关文字相同,但A有一些格式,而B则没有。我通过B并运行正则表达式来查找并用空字符串替换所有A,从而得到<contents>

现在假设我在B中的索引为9的位置选择了一个字符,这将是单词d中的字母don't。然后我如何在字符串A中确定d中的don't字母还需要选择,其索引为35(如果我计算正确的话)?

编辑:可能是重要的信息,这些标签适用于Unity中的富文本。几乎在所有方面都与HTML非常相似。

1 个答案:

答案 0 :(得分:1)

正如我在评论中已经建议的那样,您应该为此格式编写自己的解析器,将格式设置为文本旁边的元数据。例如,您可以保留一个简单的字符串部分列表,其中每个部分表示具有相同格式的连续文本。

你可以从简单化的东西开始:

import re

def parse (string):
    it = iter([None] + re.split('(<[^>]+>)', string))

    parsed = []
    curFormat = {}
    for fmt, text in zip(it, it):
        if fmt is None:
            curFormat = {}
        elif fmt.startswith('</'):
            fmt = fmt[2:-1]
            del curFormat[fmt]
        else:
            fmt = fmt[1:-1]
            if '=' in fmt:
                name, value = fmt.split('=', 1)
                curFormat[name] = value
            else:
                curFormat[fmt] = True

        if text != '':
            parsed.append((text, list(curFormat.items())))

    return parsed

对于您的文字,这将给您以下结果:

>>> text = "I <color=red><b>really</b></color> don't like spiders!"
>>> parsed = parse(text)
>>> parsed
[('I ', []), ('really', [('color', 'red'), ('b', True)]), (" don't like spiders!", [])]

如您所见,您可以获得一对文本,以及该文本特定部分的格式信息列表。如果您想获取基础文本,则可以迭代第一个列表元素:

>>> ''.join(t for t, fmt in parsed)
"I really don't like spiders!"

除此之外,您还可以创建自己的索引方法(请注意,这个方法非常粗糙):

def index (parsed, start, length):
    output = ''
    for t, fmt in parsed:
        if start < 0:
            output += t
        elif start > len(t):
            start -= len(t)
        else:
            output += t[start:]
            start = -1
        if len(output) > length:
            return output[:length]
    return output
>>> index(parsed, 4, 5)
'ally '
>>> index(parsed, 7, 6)
"y don'"

最后,你可以把它全部放在一个自定义类型中,它实现了迭代器协议和senquence协议,所以你可以像普通字符串一样使用它。