📜  Elixir-正则表达式

📅  最后修改于: 2020-11-04 08:29:46             🧑  作者: Mango


 

在本章中,我们将探索信号,即语言提供的用于处理文本表示的机制。标记以波浪号(〜)字符开头,后跟字母(标识标记),然后是定界符;可选地,可以在最终定界符之后添加修饰符。

正则表达式

Elixir中的正则表达式是Sigils。我们已经在字符串一章中看到了它们的用法。让我们再举一个例子,看看如何在Elixir中使用正则表达式。

# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)

运行上述程序时,将产生以下结果-

true
false

印记支持8种不同的定界符-

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r

支持不同定界符的原因在于,不同定界符可以更适合于不同的信号。例如,对正则表达式使用括号可能是一个令人困惑的选择,因为它们可能与正则表达式内的括号混合在一起。但是,括号可能对其他信号很方便,正如我们将在下一节中看到的那样。

Elixir支持Perl兼容的正则表达式,也支持修饰符。您可以在这里阅读更多关于正则表达式的信息

字符串,字符列表和单词列表

除正则表达式外,Elixir还有3个内置Sigils。让我们看看这些签名。

弦乐

〜s标记用于生成字符串,就像双引号一样。例如,当字符串包含双引号和单引号时,〜s标记非常有用-

new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)

此标记生成字符串。运行上述程序时,将产生以下结果-

"this is a string with \"double\" quotes, not 'single' ones"

字符列表

〜c标记用于生成字符列表-

new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)

运行上述程序时,将产生以下结果-

this is a char list containing 'single quotes'

词表

〜w标记用于生成单词列表(单词只是常规字符串)。在〜w标记内,单词之间用空格隔开。

new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)

运行上述程序时,将产生以下结果-

foobarbat

〜w标记也接受c,sa修饰符(分别用于字符列表,字符串和原子),它们指定结果列表元素的数据类型-

new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)

运行上述程序时,将产生以下结果-

[:foo, :bar, :bat]

纹章中的插值和转义

除小写字母外,Elixir还支持大写字母以处理转义字符和插值。 〜s和〜S都将返回字符串,而前者则允许转义码和内插,而后者则不允许。让我们考虑一个例子来理解这一点-

~s(String with escape codes \x26 #{"inter" <> "polation"})
# "String with escape codes & interpolation"
~S(String without escape codes \x26 without #{interpolation})
# "String without escape codes \\x26 without \#{interpolation}"

定制纹章

我们可以轻松创建自己的自定义信号。在此示例中,我们将创建符号以将字符串转换为大写。

defmodule CustomSigil do
   def sigil_u(string, []), do: String.upcase(string)
end

import CustomSigil

IO.puts(~u/tutorials point/)

当我们运行上面的代码时,它产生以下结果-

TUTORIALS POINT

首先,我们定义一个名为CustomSigil的模块,并在该模块内创建一个名为sigil_u的函数。由于现有标记空间中不存在〜u标记,因此我们将使用它。 _u表示我们希望在波浪号后使用u作为字符。函数定义必须包含两个参数,一个输入和一个列表。