syntax
8 分钟阅读
syntax
https://pkg.go.dev/regexp/syntax@go1.20.1
包语法将正则表达式解析为解析树,并将解析树编译为程序。大多数正则表达式的客户端将使用 regexp 包的工具(例如 Compile 和 Match)而不是此包。
语法 Syntax
当使用 Perl 标志进行解析时,此包理解的正则表达式语法如下。通过将替代标志传递给 Parse,可以禁用语法的某些部分。
单个字符:
. 任何字符,可能包括换行符(标志 s=true)
[xyz] 字符类
[^xyz] 反向字符类
\d Perl字符类
\D 反向 Perl 字符类
[[:alpha:]] ASCII 字符类
[[:^alpha:]] 反向 ASCII 字符类
\pN Unicode 字符类(单字母名称)
\p{Greek} Unicode 字符类
\PN 反向 Unicode 字符类(单字母名称)
\P{Greek} 反向 Unicode 字符类
复合:
xy x 后跟 y
x|y x 或 y(更偏向于 x)
重复:
x* 零个或多个 x,更偏向于多个
x+ 一个或多个 x,更偏向于多个
x? 零个或一个 x,更偏向于一个
x{n,m} n 或 n+1 或 ... 或 m 个 x,更偏向于多个
x{n,} n 或更多个 x,更偏向于多个
x{n} 恰好 n 个 x
x*? 零个或多个 x,更偏向于较少
x+? 一个或多个 x,更偏向于较少
x?? 零个或一个 x,更偏向于零
x{n,m}? n 或 n+1 或 ... 或 m 个 x,更偏向于较少
x{n,}? n 或更多个 x,更偏向于较少
x{n}? 恰好 n 个 x
实现限制:计数形式 x{n,m}
、x{n,}
和 x{n}
拒绝创建最小或最大重复计数大于 1000 的形式。无限重复不受此限制。
分组:
(re) 编号捕获组(子匹配)
(?P<name>re) 命名和编号捕获组(子匹配)
(?:re) 非捕获组
(?flags) 在当前组内设置标志;非捕获
(?flags:re) 在 re 中设置标志;非捕获
标志语法为 xyz(设置)或 -xyz(清除)或 xy-z(设置 xy,清除 z)。
标志包括:
i 不区分大小写(默认为 false)
m 多行模式:^ 和 $ 匹配行的开头和结尾以及文本的开头和结尾(默认为 false)
s 让 . 匹配 \n(默认为 false)
U 非贪婪模式:交换 x* 和 x*?x+ 和 x+?等的含义(默认为 false)
空字符串:
^ 文本或行的开头(标志 m=true)
$ 文本的结尾(类似于 \z 而不是 \Z)或行的结尾(标志 m=true)
\A 文本的开头
\b ASCII 单词边界(\w 在一侧,\W、\A 或 \z 在另一侧)
\B 非 ASCII 单词边界
\z 文本的结尾
转义序列:
\a 响铃(== \007)
\f 换页符(== \014)
\t 水平制表符(== \011)
\n 换行符(== \012)
\r 回车符(== \015)
\v 垂直制表符(== \013)
\* 字符 *(对于任何标点符号字符 * 都是字面量)
\123 八进制字符代码(最多三位数字)
\x7F 十六进制字符代码(恰好两位数字)
\x{10FFFF} 十六进制字符代码
\Q...\E 字面文本...即使...中有标点符号
字符类元素:
x 单个字符
A-Z 字符范围(包括)
\d Perl 字符类
[:foo:] ASCII 字符类 foo
\p{Foo} Unicode 字符类 Foo
\pF 字符类 F(一个字母名称)
命名字符类作为字符类元素:
[\d] 数字(== \d)
[^\d] 非数字(== \D)
[\D] 非数字(== \D)
[^\D] 非非数字(== \d)
[[:name:]] 字符类内部的命名 ASCII 类(== [:name:])
[^[:name:]] 在否定字符类中命名 ASCII 类(== [:^name:])
[\p{Name}] 字符类内的命名 Unicode 属性(== \p{Name})
[^\p{Name}] 在否定字符类中的命名 Unicode 属性(== \P{Name})
Perl字符类(仅ASCII):
\d 数字(== [0-9])
\D 非数字(== [^0-9])
\s 空格字符(== [\t\n\f\r ])
\S 非空格字符
\w 单词字符 (== [0-9A-Za-z_])
\W 非单词字符 (== [^0-9A-Za-z_])
ASCII字符类:
[[:alnum:]] 字母数字 (== [0-9A-Za-z])
[[:alpha:]] 字母 (== [A-Za-z])
[[:ascii:]] ASCII字符 (== [\x00-\x7F])
[[:blank:]] 空格或制表符 (== [\t])
[[:cntrl:]] 控制字符 (== [\x00-\x1F\x7F])
[[:digit:]] 数字 (== [0-9])
[[:graph:]] 图形字符 (== [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\]^_`{|}~] )
[[:lower:]] 小写字母 (== [a-z])
[[:print:]] 可打印字符 (== [ -~] == [ [:graph:]] )
[[:punct:]] punctuation (== [!-/:-@[-`{-~]) 标点符号 (== [!-/:-@[-`{-~] )
[[:space:]] 空格字符 (== [\t\n\v\f\r])
[[:upper:]] 大写字母 (== [A-Z]) 大写 (== [A-Z])
[[:word:]] 单词字符 (== [0-9A-Za-z_])
[[:xdigit:]] 十六进制数字 (== [0-9A-Fa-f])
Unicode字符类包括unicode.Categories和unicode.Scripts中的类别。
常量
This section is empty.
变量
This section is empty.
函数
func IsWordChar
|
|
IsWordChar函数报告 r 是否在评估 \b 和 \B 零宽断言期间被认为是"单词字符"。这些断言仅适用于 ASCII:单词字符是 [A-Za-z0-9_]。
类型
type EmptyOp
|
|
EmptyOp 指定零宽断言的一种或多种种类。
|
|
func EmptyOpContext
|
|
EmptyOpContext函数返回在符文 r1 和 r2 之间位置的满足零宽断言的内容。传递 r1 == -1 表示位置位于文本开头。传递 r2 == -1 表示位置位于文本末尾。
type Error
|
|
Error结构体描述了无法解析正则表达式的失败,并提供了出错的表达式。
(*Error) Error
|
|
type ErrorCode
|
|
ErrorCode 描述了无法解析正则表达式的失败。
|
|
(ErrorCode) String
|
|
type Flags
|
|
Flags 控制解析器的行为并记录有关正则表达式上下文的信息。
|
|
type Inst
|
|
Inst是正则表达式程序中的单个指令。
(*Inst) MatchEmptyWidth
|
|
MatchEmptyWidth方法报告指令是否在before和after之间匹配空字符串。仅在i.Op == InstEmptyWidth时才应调用它。
(*Inst) MatchRune
|
|
MatchRune方法报告指令是否与r匹配(并消耗r)。仅在i.Op == InstRune时才应调用它。
(*Inst) MatchRunePos <- go1.3
|
|
MatchRunePos方法检查指令是否与r匹配(并消耗r)。如果是,则MatchRunePos返回匹配符号对的索引(或者当len(i.Rune) == 1时,返回符号单例)。如果不是,则MatchRunePos返回-1。MatchRunePos仅在i.Op == InstRune时应调用。
(*Inst) String
|
|
type InstOp
|
|
InstOp是一个指令操作码。
|
|
(InstOp) String <- go1.3
|
|
type Op
|
|
一个Op是一个单一的正则表达式运算符。
|
|
(Op) String <- go1.11
|
|
type Prog
|
|
一个Prog是一个已编译的正则表达式程序。
func Compile
|
|
Compile方法将正则表达式编译成可执行程序。 正则表达式应该已经被简化(从re.Simplify返回)。
(*Prog) Prefix
|
|
Prefix方法返回一个字面字符串,该字符串是所有匹配该正则表达式的字符串必须以此开头。如果该字符串是整个匹配,则 complete 参数为 true。
(*Prog) StartCond
|
|
StartCond方法返回必须在任何匹配中为真的前导空宽度条件。如果没有匹配,则返回 ^EmptyOp(0)。
(*Prog) String
|
|
String方法返回表示程序的字符串。
type Regexp
|
|
Regexp结构体是正则表达式语法树中的一个节点。
func Parse
|
|
Parse方法解析一个受 flags 控制的正则表达式字符串 s,并返回一个正则表达式语法树。语法在顶层注释中描述。
(*Regexp) CapNames
|
|
CapNames方法遍历正则表达式以查找捕获组的名称。
(*Regexp) Equal
|
|
Equal方法报告 x 和 y 是否具有相同的结构。
(*Regexp) MaxCap
|
|
MaxCap方法遍历正则表达式以查找最大捕获索引。
(*Regexp) Simplify
|
|
Simplify方法返回等效于 re 的正则表达式,但不包括计数重复,并进行各种其他简化,例如将 /(?:a+)+/
重写为 /a+/
。生成的正则表达式将正确执行,但其字符串表示形式不会生成相同的解析树,因为捕获括号可能已复制或删除。例如,/(x){1,2}/
的简化形式是/(x)(x)?/
,但两个括号都捕获为 $1
。返回的正则表达式可能与原始表达式共享结构,也可能是原始表达式的副本。
(*Regexp) String
|
|