regex - 提取每一级括号的内容

标签 regex perl grammar speech parentheses

我正在转换 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/

相关文章:

regex - 带有特殊字符的 Powershell 正则表达式

perl - 为什么在这个 Perl 示例中,使用转义字符连接字符串的方式不同?

regex - 如何在 Perl 中反转正则表达式

string - 导出字符串替换

java - 带设定长度的正则表达式

regex - 在 Sublime Text 中使用正则表达式进行搜索和替换

c# - 在 C# 中使用 RegEx 在其他项出现后查找尖括号内的第一项

perl - 如何使用 mod_perl 正确减少冗余请求的数量?

rust - Rust 的句法语法是上下文无关的还是上下文敏感的?

grammar - *可以在符号 token 中使用多个字符吗?