如何将这个明文RP风格的字符串解析为更通用的XML风格字符串?

时间:2015-04-22 16:08:38

标签: algorithm text-parsing string-parsing

我正在创建一个应用程序,将角色扮演风格的消息转换为更通用的内容。用户可以指定他们的首选项,例如:

Moves
 - /me <move>
 - *<move>*
Speech
 - <speech>
 - "<speech>"
Out-of-Character
 - [<ooc>]
 - ((ooc))
 - //ooc

我需要解析这样的消息:

/me eats food "This is *munch* good!" [You're good at this]

或者像这样:

*eats food* This is *munch* good! ((You're good at this))

成一个类似于XML的更通用的字符串:

<move>eats food <speech>This is <move>munch</move> good!</speech> <ooc>You're good at this</ooc></move>

但关于哪个是哪个。例如:

*eats food "This is munch* good" // You're good at this

应解析为:

<move>eats food "This is munch</move><speech> good" </speech><ooc> You're good at this</ooc>

即使这不是用户的意图。请注意,最后一个示例中的引号未被解析,因为它们没有包装完整的段,并且当前的移动段在第一个遇到时尚未完成,并且当第二个出现时语音已经开始,并且第二个没有另一个在它之后围绕一个单独的语音段。

我已经尝试过迭代地,递归地,使用树,甚至使用正则表达式,但我没有找到一个像我想要的那样工作的解决方案。 如何将上述RP样式的消息解析为上述通用的XML样式消息?

同样重要的是保留间距。

以下是使用上述首选项的其他一些示例:

I like roller coasters.
[what are you like?]
/me eats a hamburger // wanna grab lunch after this?
*jumps up and down* This ((the party)) is great!
/me performs *an action* within an action "And that's just fine [As is *an action* in ooc in speech]"
And messages /me can change contexts // at any point
[But ill-formatted ones *must be parsed] according "to* the rules"
-And text formatted in <non-specified ways> is &not treated; specially-

成为:

<speech>I like roller coasters.</speech>
<ooc>what are you like?</ooc>
<move>eats a hamburger <ooc> wanna grab lunch after this?</ooc></move>
<move>jumps up and down</move><speech> This <ooc>the party</ooc> is great!</speech>
<move>performs <move>an action</move> within an action <speech>And that's just fine <ooc>As is <move>an action</move> in ooc in speech</ooc></speech></move>
<speech>And messages <move>can change contexts <ooc> at any point</ooc></move></speech>
<ooc>But ill-formatted ones *must be parsed</ooc><speech> according <speech>to* the rules</speech></speech>
<speech>-And text formatted in &lt;non-specified ways&gt; is &amp;not treated; specially-</speech>

2 个答案:

答案 0 :(得分:0)

你所拥有的是一堆应该触发xml标记的标记。使用每个标记的函数来实现它是相当简单的。

void move(){
     xmlPrintWriter.println("<move>");
     parse();
     xmlPrintWriter.println(content);
     xmlPrintWriter.println("</move>");
}

parse()使用输入文本并对其进行分类。

 void parse(){
     if (text.startsWith("*")) action = MOVE;
     ... other cases

     if ( action == MOVE){
         move();
     }
     ... other actions.

解析方法必须检查所有可能的状态转换器“*” - &gt;移动,“((” - &gt; ooc,“”“ - &gt;语音等。

此处 MOVE 是类常量, action 状态变量以及 text xmlPrintWriter move 解析都是方法

如果您允许上一个示例,此方法将无效。然后情况变得非常毛茸茸,需要根据具体情况来决定。

答案 1 :(得分:0)

这种影响可能会发生:

public static RPMessageSegment split(RPMessageSegment text)
{
    ArrayList<RPMessageSegment> majorSegments = new ArrayPP<>();
    scan: for(int i = 0, l = text.length() - 1; i < l; i++)
    {
        dels: for(Delimiter d : delimiters)
        {
            if (d.startsWith(text, i))
            {
                RPMessageSegment newSegment = d.extractSegment(text, i);
                i += newSegment.lengthWithOriginalDelimiters();
                majorSegments.add(newSegment);
                continue scan;
            }
        }
    }

    if (majorSegments.length() == 1)
        return majorSegments.get(0);

    for(int i = 0, l = majorSegments.length(); i < l; i++)
    {
        majorSegments.set(i, split(majorSegments.get(i)));
    }
    return new RPMessageSegment(majorSegments);
}

当然,这假设引用的类具有响应的方式。他们不应该非常难以想象,更不用说写作了。

在将其解析为RPMessageSegment之后,可以轻松地将这些内容回显到XML样式标记所包围的字符串中