我正在创建一个应用程序,将角色扮演风格的消息转换为更通用的内容。用户可以指定他们的首选项,例如:
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 ¬ 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 <non-specified ways> is &not treated; specially-</speech>
答案 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样式标记所包围的字符串中