Я конвертирую грамматику 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)])
.
Из-за этого мне нужно извлечь каждый уровень выражения в скобках, посмотреть, оканчивается ли оно вопросительным знаком, и заменить скобки и вопросительный знак квадратными скобками, если это так. Я думаю, что Эрик Стром ответит на это Вопрос почти в том, что мне нужно. Проблема в том, что когда я его использую, он возвращает самую большую совпадающую группировку, тогда как мне нужно выполнять операции с каждой отдельной группировкой.
Вот что у меня есть: s/( \( (?: [^()?]* | (?0) )* \) ) \?/[$1]/xg
. Однако при сопоставлении с ((((stuff)? that)? I)? like)?
он дает только [((((stuff)? that)? I)? like)]
. Есть идеи, как это сделать?
I
(
на[
и)?
на]
? - person David B   schedule 25.06.2012(foo ((bar)? (baz))?)
до(foo [[bar] (baz)])
- person Qtax   schedule 25.06.2012