我正在转换 SMAPI语法为 JSGF .它们是不同语音识别系统中使用的非常相似的语法。 SMAPI 按照世界其他地方的方式使用问号,表示前一件事的 0 或 1。 JSGF 为此使用方括号。因此,我需要将 stuff?
之类的字符串转换为 [stuff]
,以及 ((((stuff)? that)? I)? like)?
到 [[[[stuff] that] I] like]
。我不得不单独留下像 ((((stuff) that) I) hate)
这样的字符串。正如 Qtax 指出的那样,一个更复杂的例子是 (foo ((bar)? (baz))?)
被替换为 (foo [[bar] (baz)])
.
因此,我必须提取括号表达式的每一层,看它是否以问号结尾,如果是,则用方括号替换括号和问号。 我认为 Eric Strom 对 this 的回答问题几乎是我需要的。问题是当我使用它时,它返回最大的匹配分组,而我需要对每个单独的分组进行操作。
这是我目前所拥有的:s/(\( (?: [^()?]* | (?0) )*\) )\?/[$1]/xg
。当与 ((((stuff)? that)? I)? like)?
匹配时,它只会产生 [((((stuff)? that)? I)? like )]
。关于如何执行此操作的任何想法?
我
最佳答案
您还需要查看 ysth's solution to that question ,并使用一个已经可用的工具来解决这个问题:
use Text::Balanced qw(extract_bracketed);
$text = '((((stuff)? that)? I)? like)?';
for ($i=0; $i<length($text); $i++) {
($match,$remainder) = extract_bracketed( substr($text,$i), '()' );
if ($match && $remainder =~ /^\?/) {
substr($text,$i) =
'[' . substr($match,1,-1) . ']' . substr($remainder,1);
$i=-1; # fixed
}
}
关于regex - 提取每一级括号的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11193317/