假设我想在Choice对象 total_choice 中使用这个正则表达式,它将成为更大语法的一部分: value([3-9] [0-9] | [ 1-7] [0-9]) 这就是我构建它的方式:
Choices total_choice= new Choices();
Choices all_digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });
// value [3-9][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append( new Choices(new string[] { "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(all_digits);
total_choice.Add(gb_aux);
// value [1-7][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append(new Choices(new string[] { "1", "2", "3", "4", "5", "6", "7" }));
gb_aux.Append(all_digits); ///// <------
total_choice.Add(gb_aux);
问题出现在带箭头的句子中。如果我取消注释,程序崩溃了。我之前只做了一些相同的行,我不明白为什么现在有问题,而不是之前。
注意:我知道这不是构建语法的最佳方式,我只是简化了要关注问题的事情。
回答尼古拉的建议让我更具体。问题是我需要识别“飞行高度”,然后是数字[30,700]。但是飞行员并没有说“四十”,他们说“四零”,这就是为什么我把这样的数字分开。据我所知,尼古拉建议我建立一个更简单的语法(三个连续的数字)并控制另一个级别的范围。我喜欢这个主意。所以我这样做:
// flight level [0-9][0-9][0-9]
gb_aux = new GrammarBuilder("flight level");
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
level_choices.Add(gb_aux);
但是当我附加第二组数字时,会出现和以前一样的问题。好吧,它不会崩溃,实际上界面永远不会启动。意识到现在我不再使用all_digits对象,我每次都创建一个新对象。
另一次尝试,当我说第二个数字(然后崩溃)时,这个跳转到被拒绝的方法:
gb_aux = new GrammarBuilder("flight level");
Regex reg = new Regex(@"^\d\d\d?$"); //also tried "^\s?\d\s\d\s\d?\s?$"
Choices chose = new Choices();
chose.Add(reg.ToString());
gb_aux.Append(chose);
答案 0 :(得分:1)
你不能追加all_choices
两次,你必须创建新的选择。
总的来说,你永远不应该设计非常复杂的语法。用户永远不会关注它们,识别器将很难。允许用户说出任意数字序列,并用正则表达式解析语音识别结果。如果数字序列不匹配,则仅警告用户。如果识别出部分字符串,则允许您等待输入。
通过强制执行严格而复杂的语法,您无法识别和处理用户错误。
答案 1 :(得分:1)
知道了!虽然我仍然不确定为什么我试过的一些东西不起作用。
GrammarBuilder level = new GrammarBuilder();
level.Append("flight level", 0, 1); //"flight level" is optional
Choices digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });
level.Append(digits, 2, 3); //minimum 2 digits, maximum 3 digits