我正在将SMAPI语法转换为JSGF。它们是在不同语音识别系统中使用的非常相似的语法。SMAPI 像世界其他地方一样使用问号,表示前一件事的 0 或 1。JSGF 为此使用方括号。因此,我需要将字符串转换为stuff?
to [stuff]
,并将带括号的字符串转换为((((stuff)? that)? I)? like)?
to [[[[stuff] that] I] like]
。我必须不理会像((((stuff) that) I) hate)
. 正如 Qtax 指出的那样,一个更复杂的示例将(foo ((bar)? (baz))?)
被替换为(foo [[bar] (baz)])
.
因此,我必须提取括号表达式的每一层,看看它是否以问号结尾,如果是,则用方括号替换括号和问号。我认为 Eric Strom 对这个问题的回答几乎就是我所需要的。问题是当我使用它时,它返回最大的匹配分组,而我需要对每个单独的分组进行操作。
这是我到目前为止所拥有的:s/( \( (?: [^()?]* | (?0) )* \) ) \?/[$1]/xg
。然而,当与 匹配时((((stuff)? that)? I)? like)?
,它只产生[((((stuff)? that)? I)? like)]
. 关于如何做到这一点的任何想法?
一世