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