当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Regex用法及代码示例


Elixir语言中 Regex 相关用法介绍如下。

为 Elixir 提供正则表达式。

正则表达式基于 PCRE(Perl 兼容正则表达式)并建立在 Erlang 之上:re模块。更多信息可以在:re 模块文档.

Elixir 中的正则表达式可以使用符号~r(参见 Kernel.sigil_r/2 )或~R(参见 Kernel.sigil_R/2 )创建:

# A simple regular expression that matches foo anywhere in the string
~r/foo/

# A regular expression with case insensitive and Unicode options
~r/foo/iu

通过 sigils 创建的正则表达式被预编译并存储在 .beam 文件中。请注意,如果您正在预编译 Elixir,这可能会出现问题,请参阅"Precompilation" 部分了解更多信息。

正则表达式在内部表示为 Regex 结构。因此,只要需要匹配它们,就可以使用%Regex{}。请记住,所有结构字段都是私有的。也不能保证来自同一来源的两个正则表达式相等,例如:

~r/(?<foo>.)(?<bar>.)/ == ~r/(?<foo>.)(?<bar>.)/

可能会返回 truefalse,具体取决于您的机器、字节顺序、可用优化等。但是,您可以通过访问 source 字段来检索已编译正则表达式的源,然后直接比较它们:

~r/(?<foo>.)(?<bar>.)/.source == ~r/(?<foo>.)(?<bar>.)/.source

修饰符

创建正则表达式时可用的修饰符有:

  • unicode (u) - 启用 Unicode 特定模式,如 \p 并导致 \w\W\s 等字符类也与 Unicode 匹配(参见下面 "Character classes" 中的示例)。它期望在匹配时给出有效的 Unicode 字符串

  • caseless (i) - 添加不区分大小写

  • dotall (s) - 使 dot 匹配换行符并将换行符设置为 anycrlf;根据 :re 文档,可以通过设置 (*CR)(*LF)(*CRLF)(*ANY) 来覆盖新行设置

  • multiline (m) - 使^$ 标记每一行的开始和结束;使用 \A\z 匹配字符串的结尾或开头

  • extended (x) - 空白字符被忽略,除非转义并允许 # 分隔注释

  • firstline (f) - 强制未锚定模式在第一个换行符之前或处匹配,尽管匹配的文本可能会在换行符上继续

  • ungreedy (U) - 反转正则表达式的 "greediness"(以前的 r 选项已弃用,取而代之的是 U )

不可用的选项有:

  • anchored - 不可用,请改用 ^\A
  • dollar_endonly - 不可用,请改用 \z
  • no_auto_capture - 不可用,请改用 ?:
  • newline - 不可用,根据 :re 文档在正则表达式的开头使用 (*CR)(*LF)(*CRLF)(*ANYCRLF)(*ANY)

捕获

此模块中的许多函数通过 :capture 选项处理在正则表达式匹配中捕获的内容。支持的值为:

  • :all - 所有捕获的子模式,包括完整的匹配字符串(这是默认值)

  • :first - 只有第一个捕获的子模式,它始终是字符串的完整匹配部分;所有显式捕获的子模式都被丢弃

  • :all_but_first - 除了第一个匹配的子模式之外的所有子模式,即所有显式捕获的子模式,但不是字符串的完整匹配部分

  • :none - 根本不返回匹配的子模式

  • :all_names - 将正则表达式中的所有命名子模式匹配捕获为按子模式名称按字母顺序排列的列表

  • list(binary) - 要捕获的命名捕获列表

字符类

正则表达式支持几个内置的命名字符类。这些通过将类名包含在组内的[: :] 中来使用。例如:

iex> String.match?("123", ~r/^[[:alnum:]]+$/)
true
iex> String.match?("123 456", ~r/^[[:alnum:][:blank:]]+$/)
true

支持的类名是:

  • alnum - 字母和数字
  • 阿尔法 - 字母
  • 空白 - 仅空格或制表符
  • cntrl - 控制字符
  • digit - 十进制数字(与 \d 相同)
  • graph - 打印字符,不包括空格
  • lower - 小写字母
  • print - 打印字符,包括空格
  • punct - 打印字符,不包括字母、数字和空格
  • 空格 - 空格(与 PCRE 8.34 中的 \s 相同)
  • upper - 大写字母
  • word - "Word" 个字符(与 \w 相同)
  • xdigit - 十六进制数字

还有另一个字符类 ascii 错误地匹配 Latin-1 字符而不是 POSIX 指定的 0-127 范围。如果不改变其他类的行为,就无法解决此问题,因此我们建议将范围与 [\\0-\x7f] 匹配。

请注意,这些类的行为可能会根据 Unicode 和其他修饰符而改变:

iex> String.match?("josé", ~r/^[[:lower:]]+$/)
false
iex> String.match?("josé", ~r/^[[:lower:]]+$/u)
true
iex> Regex.replace(~r/\s/, "Unicode\u00A0spaces", "-")
"Unicode spaces"
iex> Regex.replace(~r/\s/u, "Unicode\u00A0spaces", "-")
"Unicode-spaces"

预编译

使用 sigil 构建的正则表达式被预编译并存储在 .beam 文件中。预编译的正则表达式将在运行时进行检查,并且可能在操作系统和 OTP 版本之间运行较慢。这几乎不是问题,因为在开发过程中共享的大多数 Elixir 代码都是在目标上编译的(例如依赖项、存档和 escripts),并且在生产中运行时,代码必须在目标上编译(通过 mix compile 或类似)或在主机上发布(通过mix releases 或类似)以匹配的 OTP、操作系统和架构作为目标。

如果您知道您在与当前系统不同的系统上运行并且您正在使用正则表达式进行多次匹配,您可以手动调用 Regex.recompile/1 Regex.recompile!/1 来执行运行时版本检查并在必要时重新编译正则表达式。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Regex。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。