跳转到主要内容
基于正则表达式的词典使用正则表达式来定义某种语言中哪些单词是允许的,哪些是不允许的。

正则表达式规则

下表说明了 ABBYY FineReader Engine 正则表达式字符集:
项目名称常用正则表达式符号用法示例与说明
任意字符.c.t — 表示 “cat”、“cot” 等单词
字符范围中的字符[][b-d]ell — 表示 “bell”、“cell”、“dell” 等单词 [ty]ell — 表示单词 “tell” 和 “yell”
不在字符范围中的字符[^][^y]ell — 表示 “dell”、“cell”、“tell” 等单词,但不允许 “yell” [^n-s]ell — 表示 “bell”、“cell” 等单词,但不允许 “nell”、“oell”、“pell”、“qell”、“rell” 和 “sell”
\c(a\u)t — 表示单词 “cat” 和 “cut”
连续出现 0 次或多次*10* — 表示数字 1、10、100、1000 等。
连续出现 1 次或多次+10+ — 允许数字 10、100、1000 等,但不允许 1。
字母或数字[0-9a-zA-Z][0-9a-zA-Z] — 允许单个字符;[0-9a-zA-Z]+ — 允许任意单词
大写拉丁字母[A-Z]<br />
小写拉丁字母[a-z]<br />
大写西里尔字母[А-Я]<br />
小写西里尔字母[а-я]<br />
数字[0-9]<br />
空格[\s]<br />
系统字符@<br />
字典中的单词@(Dictionary)Dictionary 参数用于设置用户字典的路径,单词必须从该字典中提取。Linux 路径示例:@(/opt/MyDictionary.amd) macOS 路径示例:“/Users/user/Documents/MyDictionary.amd 在 Windows 中,路径中的反斜杠必须写成双反斜杠。例如:@(D:\MyFolder\MyDictionary.amd)。<Note> 某些编程语言 (如 C++) 要求在 string 字面量中对反斜杠进行转义。在这种情况下,需要使用两个转义后的反斜杠,因此最终会显示为四个反斜杠。上面的示例在 C++ 中如下所示:</Note> L"@(D:\\\\\\\\MyFolder\\\\\\\\MyDictionary.amd)"
  • 正则表达式中使用的某些字符属于“辅助”字符,即用于系统目的。正如上表所示,这类字符包括方括号、句点等。如果要将辅助字符作为普通字符输入,请在其前面加上反斜杠 ()。例如:[t-v]x+ 表示 “tx”、“txx”、“txxx” 等,以及 “ux”、“uxx” 等;而 [t-v]x+ 表示 “[t-v]x”、“[t-v]xx”、“[t-v]xxx” 等。
  • 如果需要对某些正则表达式元素进行分组,请使用括号。例如,(a|b)+|c 表示 “c” 以及类似 “abbbaaabbb”、“ababab” 等任意组合 (即长度非零、可按任意顺序包含任意数量 a 和 b 的单词) ,而 a|b+|c 表示 “a”、“c” 以及 “b”、“bb”、“bbb” 等。

示例正则表达式

日期的正则表达式 表示“日”的数字可以是一位数 (例如 1、2 等) ,也可以是两位数 (例如 02、12) ,但不能为零 (00 或 0) 。因此,“日”的正则表达式如下所示:((|0)[1-9])|([12][0-9])|(30)|(31)。 “月”的正则表达式如下所示:((|0)[1-9])|(10)|(11)|(12)。 “年”的正则表达式如下所示:(((19)|(20))[0-9][0-9])|([0-9][0-9])。 接下来只需将这些组合在一起,并用句点分隔各个数字 (例如 1.03.1999) 。句点是一个辅助字符,因此必须在它前面加上反斜杠 ()。这样,完整日期的正则表达式如下所示: (((|0)[1-9])|([12][0-9])|(30)|(31)).(((|0)[1-9])|(10)|(11)|(12)).((((19)|(20))[0-9][0-9])|([0-9][0-9])) 电子邮件地址的正则表达式 您可以很容易地定义一种用于表示电子邮件地址的模式。电子邮件地址的正则表达式可能如下所示: [a-zA-Z0-9_-.]+@[a-zA-Z0-9.-]+.[a-zA-Z]+

用于数据捕获

如果您在字段级识别中使用正则表达式,通常只需识别与正则表达式完全匹配的词。在这种情况下,我们建议为这些字段创建一种单独的识别语言,并为其设置以下属性:
  1. 识别结果中只允许词典中的词:将 IBaseLanguage::AllowWordsFromDictionaryOnly 属性设置为 TRUE。这是实现精确匹配所必需的。
  2. 识别语言的字母集只能包含正则表达式中包含的字符:指定 IBaseLanguage::LetterSet 属性。这是必要的,因为即使某些字符不符合正则表达式,也可能被识别为该语言字母表中的字符。
  3. IBaseLanguage::IsNaturalLanguage 属性设置为 FALSE。

Windows 示例

// 全局 ABBYY FineReader Engine 对象
FREngine.IEngine engine;
// 一个 LanguageDatabase 对象
FREngine.ILanguageDatabase languageDatabase = engine.CreateLanguageDatabase();
// 创建一个 TextLanguage 对象
FREngine.ITextLanguage textLang = languageDatabase.CreateTextLanguage();
// 创建一个 BaseLanguage 对象并指定相关设置
FREngine.IBaseLanguage baseLang = textLang.BaseLanguages.AddNew();
baseLang.set_LetterSet(FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, "$0123456789,.");
baseLang.IsNaturalLanguage = false;
baseLang.AllowWordsFromDictionaryOnly = true;
// 创建一个新的基于正则表达式的词典,并将其关联到该语言
FREngine.IDictionaryDescription dictDescr = baseLang.DictionaryDescriptions.AddNew(FREngine.DictionaryTypeEnum.DT_RegularExpression);
// 设置正则表达式
dictDescr.GetAsRegExpDictionaryDescription().SetText(@"[$0-9,.]+");

另请参见

使用词典 RegExpDictionaryDescription