正则

正则表达式 属于 Elixir

24 个练习

关于 正则表达式

正则表达式(regex)是 Elixir 中处理字符串的强大工具。Elixir 中的正则表达式遵循 PCRE 规范(Perl Compatible Regular Expressions,即 Perl 兼容正则表达式)。用于表示正则表达式含义的字符串模式会先被编译,然后用于匹配整个字符串或其中的一部分。

在 Elixir 中,创建正则表达式最常见的方式是使用~r sigil。Sigil 为 Elixir 中的常见任务提供了_语法糖_式的简写。在这里,~r是使用Regex.compile!/2的一种简写。

Regex.compile!("test") == ~r/test/
# => true

=~/2运算符可用于对字符串执行正则匹配,返回一个boolean结果。

"this is a test" =~ ~r/test/
# => true

正则表达式语法回顾

  • 正则表达式模式中的某些字符具有特殊含义,如果想按字面意义使用这些字符,必须用\转义,例如~r/\?/。
  • 字符类(例如\d、\w)可以让模式匹配一定范围内的字符
  • 选择(|)可以让模式匹配多个模式中的一个
  • 量词({N, M}、*、?)可以让模式匹配指定次数的重复模式
  • 分组(())可以让模式的一部分作为一个整体起作用

捕获

正则表达式还可以用来提取字符串的一部分,这称为_捕获_。要_捕获_字符串的一部分,为你想捕获的部分创建一个分组(()),然后使用Regex.run。

Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]

捕获会从 1 开始编号,当用一个正则表达式替换字符串的一部分时,也可以在结果中使用这些捕获:

Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"

也可以在左括号后面加上?<name>来给捕获命名。使用Regex.named_captures/3可以获得一个包含具名捕获的映射。

Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}

修饰符

在正则表达式的末尾加上特殊标志,就可以修改正则表达式的行为,例如~r/test/i。

动态构建正则表达式

因为~r sigil 是"pattern" |> Regex.escape() |> Regex.compile!()的简写,所以你还可以用字符串插值来动态构建正则表达式模式:

anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true

正则表达式与String模块

正则表达式虽然强大,但并不是任何时候都适合使用:

  • 使用前必须先编译,这会消耗计算时间和内存。
  • 它们可能比普通的字符串函数更慢。

一般来说,只要有可能,最好使用String模块中的函数。

# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"

# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"
通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 正则表达式

练习已锁定

再解锁 10 个练习即可练习 正则表达式