本网站上的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式示例 |
正则表达式参考 |
替换字符串参考 |
书评 |
可打印 PDF |
关于本网站 |
RSS 提要和博客 |
POSIX 方括号表达式是一种特殊的字符类别。POSIX 方括号表达式与常规字符类别一样,从一组字符中匹配一个字符。它们使用带有方括号的相同语法。连字符创建范围,开头的脱字符号否定方括号表达式。
一个关键的语法差异是,反斜杠在 POSIX 方括号表达式中不是元字符。因此,在 POSIX 中,正则表达式 [\d] 匹配 \ 或 d。要匹配 ],请将其作为开头的 [ 或否定 ^ 之后的第一个字符。要匹配 -,请将其放在闭合 ] 之前。要匹配 ^,请将其放在最终文字 - 或闭合 ] 之前。放在一起,[\d^-] 匹配 ]、\、d、^ 或 -。
方括号表达式的主要目的是适应用户的语言环境或应用程序的语言环境。语言环境是描述语言和文化惯例的规则和设置的集合,例如排序顺序、日期格式等。POSIX 标准定义了这些语言环境。
通常,只有 符合 POSIX 标准的正则表达式引擎 对 POSIX 方括号表达式提供适当且完整的支持。一些不符合 POSIX 标准的正则表达式引擎支持 POSIX 字符类别,但通常不支持整理序列和字符等价项。支持 Unicode 的正则表达式引擎使用 Unicode 属性和脚本来提供类似于 POSIX 方括号表达式的功能。在 Unicode 正则表达式引擎中,简写字符类别(如 \w)通常匹配所有相关的 Unicode 字符,从而无需使用区域设置。
不要将 POSIX 术语“字符类别”与通常称为 正则表达式字符类别 的内容混淆。[x-z0-9] 是本教程中称为“字符类别”而 POSIX 称为“方括号表达式”的一个示例。[:digit:] 是一个 POSIX 字符类别,用于方括号表达式中,如 [x-z[:digit:]]。POSIX 字符类别名称必须全部小写。
当用于 ASCII 字符串时,这两个正则表达式找到完全相同的匹配项:一个字符,该字符要么是 x、y、z,要么是数字。当用于包含非 ASCII 字符的字符串时,[:digit:] 类别可能包含其他脚本中的数字,具体取决于区域设置。
POSIX 标准定义了 12 个字符类别。下表列出了全部 12 个类别,以及某些正则表达式风格也支持的 [:ascii:] 和 [:word:] 类别。如果 POSIX 类别不可用,该表还显示了可在 ASCII 和 Unicode 正则表达式中使用的等效字符类别。ASCII 等效项与 POSIX 标准中定义的内容完全对应。Unicode 等效项与大多数 Unicode 正则表达式引擎匹配的内容对应。POSIX 标准未定义 Unicode 语言环境。某些类别还具有 Perl 风格的 简写 等效项。
Java 不支持 POSIX 方括号表达式,但使用 \p 运算符支持 POSIX 字符类别。尽管 \p 语法从 Unicode 属性 的语法中借用,但 Java 中的 POSIX 类别仅匹配如下所示的 ASCII 字符。类别名称区分大小写。与只能在方括号表达式内使用的 POSIX 语法不同,Java 的 \p 可以在方括号表达式内和外部使用。
在 Java 8 及更早版本中,使用 \p 语法时是否使用 Is 前缀并不重要。因此,在 Java 8 中,\p{Alnum} 和 \p{IsAlnum} 是相同的。在 Java 9 及更高版本中存在差异。如果没有 Is 前缀,则行为与 Java 的先前版本完全相同。带有 Is 前缀的语法现在也匹配 Unicode 字符。对于 \p{IsPunct},这也意味着它不再匹配符号 Unicode 类别中的 ASCII 字符。
JGsoft 风格 支持 POSIX 和 Java 语法。最初,它使用任一语法匹配 Unicode 字符。从 JGsoft V2 开始,使用 POSIX 语法时仅匹配 ASCII 字符,使用 Java 语法时匹配 Unicode 字符。
POSIX | 描述 | ASCII | Unicode | 简写 | Java |
---|---|---|---|---|---|
[:alnum:] | 字母数字字符 | [a-zA-Z0-9] | [\p{L}\p{Nl} \p{Nd}] | \p{Alnum} | |
[:alpha:] | 字母字符 | [a-zA-Z] | \p{L}\p{Nl} | \p{Alpha} | |
[:ascii:] | ASCII 字符 | [\x00-\x7F] | \p{InBasicLatin} | \p{ASCII} | |
[:blank:] | 空格和制表符 | [ \t] | [\p{Zs}\t] | \h | \p{Blank} |
[:cntrl:] | 控制字符 | [\x00-\x1F\x7F] | \p{Cc} | \p{Cntrl} | |
[:digit:] | 数字 | [0-9] | \p{Nd} | \d | \p{Digit} |
[:graph:] | 可见字符(除空格和控制字符外的任何内容) | [\x21-\x7E] | [^\p{Z}\p{C}] | \p{Graph} | |
[:lower:] | 小写字母 | [a-z] | \p{Ll} | \l | \p{Lower} |
[:print:] | 可见字符和空格(除控制字符外的任何内容) | [\x20-\x7E] | \P{C} | \p{Print} | |
[:punct:] | 标点符号(和符号)。 | [!"\#$%&'()*+, \-./:;<=>?@\[ \\\]^_`{|}~] | \p{P} | \p{Punct} | |
[:space:] | 所有空白字符,包括换行符 | [ \t\r\n\v\f] | [\p{Z}\t\r\n\v\f] | \s | \p{Space} |
[:upper:] | 大写字母 | [A-Z] | \p{Lu} | \u | \p{Upper} |
[:word:] | 单词字符(字母、数字和下划线) | [A-Za-z0-9_] | [\p{L}\p{Nl} \p{Nd}\p{Pc}] | \w | \p{IsWord} |
[:xdigit:] | 十六进制数字 | [A-Fa-f0-9] | [A-Fa-f0-9] | \p{XDigit} | |
POSIX | 描述 | ASCII | Unicode | 简写 | Java |
POSIX 区域设置可以有排序序列来描述如何对某些字符或字符组进行排序。例如,在捷克语中,ch 如 chemie(捷克语中的“化学”)是一个二合字母。这意味着它应该被视为一个字符。它在捷克语字母表中排在 h 和 i 之间。当捷克区域设置 (cs-CZ) 处于活动状态时,您可以在方括号表达式中使用排序序列元素 [.ch.] 来匹配 ch。正则表达式 [[.ch.]]emie 匹配 chemie。注意双重方括号。一对用于方括号表达式,一对用于排序序列。
除了 POSIX 兼容系统的一部分 POSIX 兼容引擎外,本教程中讨论的任何正则表达式风格都不支持排序序列。
请注意,当区域设置设置为捷克语时,完全 POSIX 兼容的正则表达式引擎将 ch 视为单个字符。这意味着 [^x]emie 也匹配 chemie。 [^x] 匹配一个不是 x 的单个字符,其中包括捷克 POSIX 区域设置中的 ch。
在任何其他正则表达式引擎中,或者在使用不将 ch 视为二合字母的区域设置的 POSIX 引擎中,[^x]emie 匹配拼写错误的单词 cemie,但不匹配 chemie,因为 [^x] 无法匹配两个字符 ch。
最后,请注意,并非所有声称实现 POSIX 正则表达式的正则表达式引擎都真正完全支持排序序列。有时,这些引擎使用 POSIX 定义的正则表达式语法,但没有完全的区域设置支持。您可能需要尝试上述匹配,以查看您正在使用的引擎是否支持。例如,Tcl 的 regexp 命令 支持排序序列的语法。但 Tcl 只支持 Unicode 区域设置,它不定义任何排序序列。结果,在 Tcl 中,指定单个字符的排序序列只匹配该字符。所有其他排序序列都会导致错误。
POSIX 区域设置可以定义字符等价,指示某些字符应被视为排序相同。例如,在法语中,排序单词时会忽略重音符号。 élève 在 être 之前,后者在 événement 之前。 é 和 ê 都与 e 相同,但 l 在 t 之前,后者在 v 之前。将区域设置设为法语后,当你在方括号表达式 [[=e=]] 中使用排序序列 [=e=] 时,符合 POSIX 标准的正则表达式引擎会匹配 e、é、è 和 ê。
如果一个字符没有任何等价字符,则字符等价标记会简单地恢复为字符本身。例如,在法语区域设置中,[[=x=][=z=]] 与 [xz] 相同。
与排序序列类似,POSIX 字符等价在除遵循 POSIX 标准之外的本教程中讨论的任何正则表达式引擎中均不可用。而那些可用的引擎可能没有必要的 POSIX 区域设置支持。这里,Tcl 的 regexp 命令 也支持字符等价的语法。但是,Tcl 支持的唯一区域设置 Unicode 区域设置没有定义任何字符等价。这实际上意味着在 Tcl 中,[[=e=]] 和 [e] 完全相同,并且只匹配 e,对于你尝试的任何字符(而不是“e”)都是如此。
| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |
| 简介 | 目录 | 特殊字符 | 不可打印字符 | 正则引擎内部 | 字符类 | 字符类减法 | 字符类交集 | 简写字符类 | 点 | 锚点 | 单词边界 | 交替 | 可选项 | 重复 | 分组和捕获 | 反向引用 | 反向引用,第 2 部分 | 命名组 | 相对反向引用 | 分支重置组 | 自由间距和注释 | Unicode | 模式修饰符 | 原子分组 | 占有量词 | 前瞻和后顾 | 前瞻和后顾,第 2 部分 | 将文本保留在匹配之外 | 条件 | 平衡组 | 递归 | 子例程 | 无限递归 | 递归和量词 | 递归和捕获 | 递归和反向引用 | 递归和回溯 | POSIX 方括号表达式 | 零长度匹配 | 继续匹配 |
页面 URL:https://regexper.cn/posixbrackets.html
页面上次更新时间:2023 年 8 月 29 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。