正则表达式语法

以下正则表达式说明部分基于 Henry Spencer 创建的 REGEXP 库文档。Sally 使用此库匹配正则表达式。

基本正则表达式语法
  • '^'——位于表达式开头时匹配行首,例如 '^test' 匹配位于行首的 'test' 字符串
  • '$'——位于表达式末尾时匹配行尾
  • '.'——匹配任意单个字符,例如 'do.' 匹配 'dog'、'dot'、'doe','d..r' 匹配 'door'、'deer' 等
  • '*'——位于表达式后时,匹配其 0 次或更多次出现。例如 'ad*' 匹配 'a'、'ad' 和 'add',即 'a' 后跟任意数量的 'd'
  • '+' — 放在表达式后,匹配该表达式出现 1 次或多次的情况(例如,'do+' 匹配 'do' 和 'doo',即 'd' 后跟至少一个 'o')。
  • '?' — 放在表达式后,匹配该表达式出现 0 次或 1 次的情况(例如,'add?' 匹配 'ad' 和 'add',即 'ad' 后可跟一个 'd')。
  • '|' — 放在表达式之间,匹配第一个、第二个等任一表达式(例如,'red|blue|black' 匹配 'red'、'blue' 和 'black',即这些单词中的任意一个)。
  • '[ ]' — 方括号中的字符匹配其中列出的任意单个字符,不匹配其他字符(例如,'a[dts]' 匹配 'ad'、'at' 和 'as',即 'a' 后跟 'd'、't' 或 's')。
  • '[^ ]' — 匹配未在方括号内列出的任意单个字符(例如,'[^abc]' 匹配除 'a'、'b' 和 'c' 以外的任意字符)。
  • '[-]' — 表示字符范围(例如,'1[0-9]' 匹配 '10' 到 '19' 范围内的所有数字)。
  • '( )' — 将括号内的表达式组合为一个表达式(例如,'(very )*well' 匹配 'well'、'very well' 和 'very very well',即任意个 'very ' 后跟 'well')。
  • '\' — 放在任意字符前,匹配该字符本身(例如,'too\.' 仅匹配 'too.';注意,'too.' 则匹配 'tool'、'took' 和 'toon',即 'too' 后跟任意字符)。
正则表达式语法

正则表达式由零个或多个用 '|' 分隔的分支组成。只要与其中一个分支匹配,就与该正则表达式匹配。

分支由零个或多个片段连接而成。它依次匹配第一个片段、第二个片段,依此类推。

片段是一个原子,后面可跟 '*'、'+' 或 '?'。原子后跟 '*' 时,匹配该原子出现 0 次或多次的序列;后跟 '+' 时,匹配出现 1 次或多次的序列;后跟 '?' 时,匹配该原子一次或匹配空字符串。

原子可以是括号中的正则表达式(匹配该正则表达式所匹配的内容)、范围(见下文)、'.'(匹配任意单个字符)、'^'(匹配行首的空字符串)、'$'(匹配行尾的空字符串)、'\' 后跟单个字符(匹配该字符),或没有其他特殊含义的单个字符(匹配该字符本身)。

范围是用 '[]' 括起的字符序列。通常匹配序列中的任意单个字符。如果序列以 '^' 开头,则匹配未出现在其余序列中的任意单个字符。如果序列中的两个字符用 '-' 分隔,则表示这两个字符之间的所有 ASCII 字符(例如,'[0-9]' 匹配任意十进制数字)。要在序列中包含字面字符 ']',请将它放在首位(如有 '^',则放在其后)。要包含字面字符 '-',请将它放在首位或末位。

歧义

如果正则表达式可以匹配文本中的两个不同部分,则选择起始位置最靠前的部分。如果两者起始位置相同,但匹配长度不同,或长度相同而匹配方式不同,情况就较复杂,具体规则如下。

通常,分支列表按从左到右的顺序尝试;'*'、'+' 和 '?' 优先尝试最长的匹配;嵌套结构从最外层向内处理;连接的结构优先处理最左侧。最终选择使用最早可行选项的匹配。

例如,'(ab|a)b*c' 可以通过两种方式匹配 'abc'。首先要在 'ab' 和 'a' 之间选择;由于 'ab' 排在前面,并且能使整个表达式匹配成功,因此选择它。由于 'b' 已被匹配,'b*' 必须遵循前面的选择,只能采用最后一种可能,即空字符串。

在不含 '|' 且只有一个 '*'、'+' 或 '?' 的特殊情况下,最终会选择尽可能长的匹配。因此,'ab*' 匹配 'xabbbby' 时会得到 'abbbb'。注意,如果用 'ab*' 匹配 'xabyabbbz',根据起始位置最靠前的规则,会匹配紧接 'x' 后的 'ab'。

From the Sally manual (GPL-2.0-or-later), © 1997-2023 Open Salamander Authors; © 2025-2026 Elias Bachaalany. Source: manual source (zip) · original page in the Sally repository