正则表达式定义
在抽取非语言实体时,您可能希望对其进行编辑或将其添加到用于标识正则表达式的正则表达式定义中。此操作在“高级资源”选项卡上的正则表达式定义部分中完成。请参阅主题关于高级资源,以获取更多信息。
文件划分为多个不同部分。第一个部分称为 [macros]。除该部分以外,对于每个非语言实体还可能存在其他部分。可以将各部分添加到此文件中。在每个部分中,规则会进行编号(regexp1、regexp2,依此类推)。这些规则必须从 1 到 n 顺序编号。任何编号中断都将导致此文件的处理全部暂挂。
在某些情况下,实体根据语言而定。如果实体针对配置文件中的语言参数采用除 0 以外的值,那么将该实体视为根据语言而定。请参阅主题配置,以获取更多信息。当实体根据语言而定时,必须使用语言作为部分名称的前缀,例如 [english/PhoneNumber]。该部分将会包含仅当针对英语指定 PhoneNumber 实体的值为 2 时才适用于英语电话号码的规则。
注意!如果在编辑器中对此文件或任何其他文件进行更改,并且抽取引擎不再按期望工作,请使用工具栏上的重置为原始选项将文件重置为原始交付内容。此文件要求对正则表达式有一定程度的熟悉。如果在此方面需要其他帮助,请联系 IBM® Corp. 以获取帮助。
特殊字符包括 . [] {} () \ * + ? | ^ $
除在表达式中用于特定用途的以下特殊字符外,所有字符都与自身匹配:.[{()\*+?|^$ 要照此使用这些字符,必须在定义中为其前置反斜杠 (\)。
例如,如果尝试抽取 Web 地址,那么句号字符对于实体非常重要,因此必须为其添加反斜杠,例如:
www\.[a-z]+\.[a-z]+
重复运算符和限定符包括 ? + * {}
要使定义更灵活,可以对正则表达式使用若干标准通配符。包括 * ? +
-
星号 * 指示有零个或多个前置字符串。例如,
ab*c与“ac”、“abc”、“abbbc”等等匹配。 -
加号 + 指示有一个或多个前置字符串。例如,
ab+c与“abc”、“abbc”、“abbbc”匹配,但与“ac”不匹配。 -
问号 ?指示有零个或一个前置字符串。例如,
modell?ing与“modeling”和“modeling”均匹配。 -
使用大括号 {} 限制重复指示重复的边界。例如,
[0-9]{n}与恰好重复 n 次的数字匹配。例如,[0-9]{4}将与“1998”匹配,但是既不与“33”匹配,也不与“19983”匹配。[0-9]{n,}与重复 n 次或多次的数字匹配。例如,[0-9]{3,}将与“199”或“1998”匹配,但不与“19”匹配。[0-9]{n,m}与重复介于 n 次和 m 次(包括 n 和 m)之间的数字匹配。例如,[0-9]{3,5}将与“199”、“1998”或“19983”匹配,但既不与“19”匹配,也不与“199835”匹配。
可选空格和连字符
在某些情况下,您希望在定义中包含可选空格。
例如,如果要抽取货币(如“uruguayan pesos”、“uruguayan peso”、“uruguay pesos”、“uruguay peso”、“pesos”或“peso”),那么将需要考虑可能实际有两个以空格分隔的单词的情况。在此情况下,此定义应编写为 (uruguayan |uruguay )?pesos?。由于 uruguayan 或 uruguay 在与 pesos/peso 配合使用时后跟空格,因此必须在可选序列 (uruguayan |uruguay ) 中定义可选空格。如果可选序列中不含空格(如 (uruguayan|uruguay)? pesos?),那么它将不与“pesos”或“peso”匹配,因为必需空格。
如果在列表中查找包括连字符在内的一系列内容,那么必须最后定义连字符。例如,如果查找逗号 (,) 或连字符 (-),请使用 [,-] 而绝不使用 [-,]。
列表和宏中的字符串顺序
应始终在较短的序列之前定义最长的序列,否则将永不读取最长的序列,因为将对较短的序列进行匹配。例如,如果查找字符串“billion”或“bill”,那么必须在“bill”之前定义“billion”。因此,例如 (billion|bill) 而不是 (bill|billion)。这也适用于宏,因为宏是字符串列表。
定义部分中的规则顺序
每行定义一个规则。在每个部分中,规则会进行编号(regexp1、regexp2,依此类推)。这些规则必须从 1 到 n 顺序编号。任何编号中断都将导致此文件的处理全部暂挂。要禁用条目,请在用于定义正则表达式的每行的开头放置 # 符号。要启用条目,请移除该行前面的 # 字符。
在每个部分中,应在最广义的规则之前定义最具体的规则,以确保正确处理。例如,如果查找格式为“month year”和“month”的日期,那么必须在“month”规则之前定义“month year”规则。以下显示应如何进行定义:
#@# January 1932
regexp1=$(MONTH),? [0-9]{4}
#@# January
regexp2=$(MONTH)
而不是
#@# January
regexp1=$(MONTH)
#@# January 1932
regexp2=$(MONTH),? [0-9]{4}
在规则中使用宏
只要在若干规则中使用了特定序列,即可使用宏。然后,如果需要更改此序列的定义,那么只需更改一次即可,无需在引用此序列的所有规则中都进行更改。例如,假设具有以下宏:
MONTH=((january|february|march|april|june|july|august|september|october|
november|december)|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)(\.)?)
只要引用该宏的名称,就必须在 $() 中将其括起来,例如:regexp1=$(MONTH)
必须在 [macros] 部分中定义所有宏。