POSIX 正则表达式语法和示例

正则表达式(通常简称为“regex”)比先前部分中讨论的使用通配符的表达式复杂得多。不同于通配符,正则表达式将匹配包含指定的模式的字符序列,无论此模式在词中出现于何处。如本部分中后文所述,您可以使用锚点符号“^”(位于词开头)和“$”(位于词末尾)来限制词中将匹配正则表达式的位置,或者通过指定这两种锚点符号来将匹配限制于整个词。

正则表达式为各种字符指定特殊含义,这些字符通常称为元字符

  • 句点、点或句号 (.) - 匹配表达式中的任何单宽度 ASCII 字符,换行符除外。要使用单个句点匹配多字节字符,必须使用兼容 Perl 的正则表达式,如兼容 Perl 的正则表达式语法中所述。

    由于针对正则表达式的支持为面向词汇的支持,因此“.”缺省情况下不匹配作为断字字符的空格或跳格。例如,正则表达式“f.rm”将匹配包含字符序列(如“farm”、“firm”和“form”)的任何词,包括“farmer”、“firmament”和“conform”- 包含由“f”、后接任何其他字符、后接字符“rm”组成的字符序列的任何词。

    提示: “.”符号在通配符表达式中等同于“?”字符。“.*”序列在通配符表达式中等同于“*”。
  • 星号 (*) - 匹配出现零次或更多次的前置标记。例如,正则表达式“to*”匹配包含字母“t”和字符串的词(如“it”、“to”和“too”),因为前置标记为单个字符“o”,此字符在匹配表达式中可出现零次。正则表达式“f[aio]*t”将匹配“fat”、“fit”、“fait”、“fiat”和“foot”等词,因为前置标记是包含“a”、“i”或“o”的字符类。
  • 加号 (+) - 匹配出现一次或多次的前置标记。相比于上一个项目符号中提供的示例,正则表达式“to+”仅匹配包含字符序列“to”和“too”的词,因为前置标记为单个字符“o”,此字符在匹配表达式中必须至少出现一次。正则表达式“f[aio]+t”匹配包含字符序列“fit”、“fat”、“fiat”和“foot”的词,因为前置标记是包含“a”、“i”或“o”的字符类,并且该字符集中至少一个字符必须存在以匹配正则表达式。
  • 问号 (?) - 将前置字符识别为可选字符。例如,正则表达式“too?”匹配包含字符序列“to”和“too”的词。
  • 竖线或管道字符 (|) - 分隔标记,其中一个标记必须匹配,与逻辑 OR 语句相似。例如,正则表达式“fa|i|ot”匹配包含字符序列“fa”、“i”、“fat”或“fit”的词,因为可将其视作为“fa”、“i”或“ot”,或者序列“f 和(a、i 或 o)和 t”。使用“|”符号的正则表达式的任何部分通常都使用括号括起,以消除“|”适用于的标记的歧义。(请参阅下一个项目符号以获取示例。)
  • 左右圆括号(“(”和“)”)- 将多个标记分组在一起,以消除其引用的歧义或者简化其引用。例如,正则表达式“f(a|i|o)t”匹配包含字符序列“fat”或“fit”的词,但不包含“fa”,因为匹配序列必须包含三个字符,并且中间字符限制为字母“a、i 或 o”之一。
  • 左方括号 ([) 和右方括号 (]) - 括起要匹配的特定字符或一组字符。方括号内括起的字符称为字符类。例如,正则表达式“f[io]rm”将匹配包含字符序列“firm”和“form”的词,但不匹配包含以“f”开头且以“rm”结尾的其他序列的任何其他词。字符类仅匹配单个字符,除非后接正则表达式中有特殊含义的其他字符。
  • 插入标记 (^) - 插入标记在正则表达式中根据出现位置有两种不同含义:
    • 作为字符类的第一个字符,插入标记否定字符类中的字符。例如,正则表达式“f[^io]rm”将匹配包含以“f”开头且以“rm”结尾但第二个字符不是“i”或“o”的字符序列的任何词。因此它将匹配包含字符序列“farm”的词,但不匹配包含序列“firm”或“form”的词。
    • 作为正则表达式的第一个字符,插入标记识别词汇的开始位置。在此上下文中,插入标记通常称为锚点字符。
  • 美元符号 ($) - 作为正则表达式中的最后一个字符,美元符号用于识别词汇的结束位置。在此上下文中,美元符号通常称为锚点字符。
    注: 如果要将正则表达式匹配限制为整个词,那么锚点字符非常重要。例如,正则表达式“f[aio]rm”将匹配包含字符串“farm”、“firm”和“form”的词(包括如“farmer”、“infirm”、“former”和“conform”之类的词),而正则表达式“^f[aio]rm”仅匹配其中含“farm”和“form”的词,正则表达式“^f[air]rm$”仅匹配其中含“farm”、“firm”和“form”的词。
  • 反斜杠 (\) - 用于为正则表达式中的元字符调用实际字符值。例如,正则表达式“Comin?”将匹配词“Coming”、“Comint”和问号“Comin?”. 表达式“Comin\?”将仅匹配问号“Comin?”。

请注意,配置全局选项 HTTP referrer 白名单时,仅限使用前述列表中讨论的正则表达式语法。但正则表达式语法还支持多种特殊字符序列,以匹配不可打印的字符、特殊字符类(如数字或字母字符)等。完整的正则表达式语法讨论不在 Watson™ Explorer Engine 文档范围内。要了解正则表达式的完整讨论,请参阅正则表达式信息站点