可以使用一些Microsoft手写识别器理解的手写正则表达式语法来定义和分配自定义输入范围。 语法是 .NET Framework 中 正则表达式语言实现 的子集。
手写正则表达式的使用方式和其他类型的正则表达式的使用方式存在一些差异。 手写语法用于指定将由识别引擎而不是子字符串匹配的确切字符串。 例如,正则表达式 s([a-z]+)p 将返回“汤”、“stop”、“instep”和“esophagus”的匹配项。 而等效的手写正则表达式(如 s(!IS_ONECHAR)+p 将匹配“汤”和“stop”,但与“步进”和“食道”不匹配。
手写正则表达式不支持正则表达式中的非中断空格。 也就是说,不能在手写正则表达式中使用“nbsp”实体。
以下部分更详细地介绍了语法。
有效运算符
以下运算符可用于创建正则表达式来定义手写识别器的输入范围。
| 算子 | 描述 |
|---|---|
| * |
后缀一元运算符表示作数的零个或多个匹配项。 |
| + |
后缀一元运算符表示作数的一个或多个匹配项。 |
| ? |
后缀一元运算符表示作数的零个或一个匹配项。 |
| | |
二进制内缀运算符表示“or”。 |
| () |
用于对项进行分组。 |
手写识别器的正则表达式的Microsoft实现允许重复应用后缀一元运算符。 例如,a** = (a*)* = a*, b?? = (b?)? = b?. 它们还允许非连续重复,例如:a*?* = (a*)?)* = (a*)* = a*。 这不同于 .NET Framework 正则表达式,只允许 ? 要重复的运算符。
与 .NET Framework 正则表达式的另一个区别是,手写正则表达式不支持用空括号 () 指定的空表达式。
注意
手写正则表达式仅支持 1252 代码页中的字符。
使用输入范围
还可以在正则表达式中使用定义为 SetInputScope 函数的一部分的常规输入范围集。 例如,月份(数字)的值IS_DATE_MONTH。 将输入范围指定为正则表达式的一部分的语法是将输入范围枚举值前面加上一个左括号和感叹号(!,并在末尾放置右括号)。 例如:
(!IS_DATE_MONTH)
如果将IS_DEFAULT输入范围与任何其他输入范围结合使用,则效果是,识别器可以返回默认语言模型支持的任何单个表达式(例如,系统字典中的一个单词或日期),或者满足传递给识别器的其余正则表达式的任何值。
注意
正则表达式不支持 SetInputScope 的以下成员:IS_PHRASELIST、IS_REGULAREXPRESSION、IS_SRGS、IS_XML。
不支持的运算符
创建手写正则表达式时,不支持以下正则表达式运算符。
| 算子 | 描述 |
|---|---|
| . |
句点字符。 |
| [] |
方括号。 使用括号对项进行分组。 |
| {} |
大括号。 |
| (?# comment) 和 #[ comment ] |
评论。 |
| $ |
美元符号字符。 |
| ^ |
插入符号字符。 |
| - |
短划线字符。 必须或(|)将所有项集组合在一起。 |
转义字符
除了下表中的普通字符外,它们与自身匹配。 也就是说,正则表达式中的“a”指定输入应与“a”匹配。
编写手写正则表达式的另一个显著区别在于,只能在正则表达式中转义有限的一组字符。 下表概述了可以转义的允许字符集。 任何其他尝试转义字符都将导致识别器引发错误。
| 字符 |
|---|
| \* |
| \+ |
| \? |
| \( |
| \) |
| \| |
| \\ |
| \! |
| \. |
| \[ |
| \] |
| \^ |
| \{ |
| \} |
| \$ |
| \# |