ÕýÔò±í´ïʽ | Regex
ΪElixirÌṩÕýÔò±í´ïʽ¡£
ÕýÔò±í´ïʽ»ùÓÚPCRE£¨Perl¼æÈÝÕýÔò±í´ïʽ£©£¬²¢»ùÓÚErlang :re
Ä£¿é¹¹½¨¡£¸ü¶àÐÅÏ¢¿ÉÒÔÔÚ:re
Ä£¿éÎĵµÖÐÕÒµ½¡£
¿ÉÒÔʹÓÃSigils´´½¨elxirÖеÄÕýÔò±í´ïʽ¡£~r
»ò~R
*
# A simple regular expressions that matches foo anywhere in the string
~r/foo/
# A regular expression with case insensitive and Unicode options
~r/foo/iu
ͨ¹ýSigils´´½¨µÄÕýÔò±í´ïʽ±»Ô¤±àÒë²¢´æ´¢ÔÚ.beam
µµ°¸¡£×¢Ò⣬Èç¹ûÄúÕýÔÚÔ¤±àÒëElixir£¬Çë²ÎÔÄ¡°Ô¤±àÒ롱²¿·ÖÒÔ»ñµÃ¸ü¶àÐÅÏ¢£¬Õâ¿ÉÄÜÊÇÒ»¸öÎÊÌâ¡£
RegexÔÚÄÚ²¿±íʾΪRegex
½á¹¹¡£Òò´Ë£¬%Regex{}
¿ÉÒÔÔÚÐèҪƥÅäµÄʱºòʹÓá£Çë¼Çס£¬²»Äܱ£Ö¤À´×ÔͬһԴµÄÁ½¸öÕýÔò±í´ïʽÊÇÏàµÈµÄ£¬ÀýÈ磺
~r/(?<foo>.)(?<bar>.)/ == ~r/(?<foo>.)(?<bar>.)/
¿ÉÄÜ»á»ØÀ´true
»òfalse
È¡¾öÓÚÄúµÄ¼ÆËã»ú¡¢endian¡¢¿ÉÓõÄÓÅ»¯ÒÔ¼°ÆäËû¡£µ«ÊÇ£¬Äú¿ÉÒÔͨ¹ý·ÃÎÊsource
×ֶΣ¬È»ºóÖ±½Ó±È½ÏÕâЩ×ֶΣº
~r/(?<foo>.)(?<bar>.)/.source == ~r/(?<foo>.)(?<bar>.)/.source
Ô¤±àÒë
ʹÓÃsigil¹¹½¨µÄÕýÔò±í´ïʽ±»Ô¤±àÒë²¢´æ´¢ÔÚ.beam
µµ°¸¡£Èç¹ûÄúÕýÔÚÔ¤±àÒëElixirÒÔÔÚ²»Í¬µÄOTP°æ±¾ÖÐÔËÐУ¬Õâ¿ÉÄÜÊÇÒ»¸öÎÊÌ⣬ÒòΪOTP·¢Ðаæ¿ÉÄÜËæʱ¸üеײãÕýÔò±í´ïʽÒýÇæ¡£
³öÓÚÕâЩÔÒò£¬ÎÒÃÇ×ÜÊÇʹÓÃOTP°æ±¾Ô¤±àÒëElixirÏîÄ¿£¬ÒÔ±ãÔÚÉú²úÖÐÔËÐС£Èç¹û½»²æ±àÒëÊDZØÒªµÄ£¬Äú¿ÉÒÔÊÖ¶¯µ÷Óá£Regex.recompile/1
»òRegex. recompile!/1
ÈôÒªÖ´ÐÐÔËÐÐʱ°æ±¾¼ì²é£¬²¢ÔÚ±ØҪʱÖØбàÒëregex¡£
ÐÞÊηû
´´½¨Regexʱ¿ÉÓõÄÐÞÊηûÈçÏ£º
unicode
£¨U£© -ʹµÃÏñUnicodeµÄ¾ßÌåģʽ\p
ºÍ±ä»¯ÐÞÊηûÏñ\w
£¬\W
£¬\s
ºÍÅóÓÑҲƥÅäUnicodeµÄ¡£ËüÆÚÍûÔÚÆ¥Åäʱ¸ø³öÓÐЧµÄUnicode×Ö·û´®
caseless
£¨i£© - Ôö¼Ó²»Çø·Ö´óСд
dotall
£¨s£© - ʹµãÆ¥Åä»»Ðзû£¬²¢½«»»ÐзûÉèÖÃΪanycrlf; еÄÉú²úÏßÉèÖÿÉÒÔͨ¹ýÉèÖÃÀ´¸²¸Ç(*CR)
»ò(*LF)
»ò(*CRLF)
»ò(*ANY)
¸ù¾ÝÖØÐÂÎĵµ
multiline
£¨m£© - ÒýÆð^
²¢$
±ê¼ÇÿһÐеĿªÊ¼ºÍ½áÊø; ʹÓÃ\A
ºÍ\z
Æ¥Åä×Ö·û´®µÄ½áβ»ò¿ªÍ·
extended
£¨x£© - ³ý·ÇתÒå²¢ÔÊÐí#
·Ö¸ô×¢ÊÍ£¬·ñÔò½«ºöÂÔ¿Õ°××Ö·û
firstline
£¨f£© - Ç¿ÖÆδ궨ͼ°¸ÔÚµÚÒ»¸ö»»Ðзû֮ǰ»òµÚÒ»¸ö»»Ðзû´¦Æ¥Å䣬¾¡¹ÜÆ¥ÅäµÄÎı¾¿ÉÄÜ»áÔÚ»»ÐзûÉϼÌÐø
ungreedy
£¨U£© - ·´×ªÕýÔò±í´ïʽµÄ¡°Ì°À·¡±£¨ÒÔÇ°µÄr
Ñ¡ÏîÒÑÆúÓöø²»ÔÞ³ÉU
£©²»¿ÉÓõÄÑ¡ÏîÓУº
anchored
- ²»¿ÉÓã¬Ê¹ÓÃ^
»ò\A
¸ÄΪ
dollar_endonly
- ²»¿ÉÓã¬Çë\z
¸ÄÓÃ
no_auto_capture
- ²»¿ÉÓã¬Çë?:
¸ÄÓÃ
newline
- ²»¿ÉÓ㬸ù¾ÝÖØÐÂÎĵµ£¬ÔÚÕýÔò±í´ïʽÖÐʹÓÃ(*CR)
»ò(*LF)
»ò(*CRLF)
»ò(*ANYCRLF)
»ò(*ANY)
ÔÚ¿ªÊ¼´¦
²¶×½
±¾Ä£¿éÖеÄÐí¶àº¯Êýͨ¹ý:capture
Ñ¡Ôñ¡£ËùÖ§³ÖµÄÖµÊÇ£º
:all
- ËùÓⶻñµÄ×Óģʽ£¬°üÀ¨ÍêÕûµÄÆ¥Åä×Ö·û´®£¨ÕâÊÇĬÈϵģ©
:first
-Ö»ÓеÚÒ»¸ö²¶»ñµÄ×Óģʽ£¬ËüʼÖÕÊÇ×Ö·û´®µÄÍêÈ«Æ¥Å䲿·Ö£»ËùÓÐÏÔʽ²¶»ñµÄ×Óģʽ¶¼±»¶ªÆú
:all_but_first
-³ýÁ˵ÚÒ»¸öÆ¥Åä×Óģʽ£¬¼´ËùÓÐÏÔʽ²¶»ñ×Óģʽ£¬¶ø²»ÊÇ×Ö·û´®µÄÍêÈ«Æ¥Å䲿·Ö¡£
:none
-¸ù±¾²»·µ»ØÆ¥ÅäµÄ×Óģʽ
:all_names
-²¶»ñRegexÖеÄËùÓÐÃû³Æ
list(binary)
-Òª²¶»ñµÄÃüÃû²¶»ñµÄÁбí
ÀàÐÍ
T£¨£©
¹¦ÄÜ
±àÒ루ԴÂ룬ѡÏî\¡°¡±£©
±àÒëÕýÔò±í´ïʽ
±àÒ룡£¨À´Ô´£¬Ñ¡Ïî\¡°¡±£©
±àÒëÕýÔò±í´ïʽ²¢Òý·¢Regex.CompileError
ÈçÓдíÎó
escape£¨×Ö·û´®£©
תÒå×Ö·û´®£¬ÒÔ±ãÔÚÕýÔò±í´ïʽÖа´×ÖÃæÆ¥Åä¡£
Æ¥Å䣿£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£©
·µ»ØָʾÊÇ·ñÆ¥ÅäµÄ²¼¶ûÖµ¡£
named_captures£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
·µ»Ø¸ø¶¨µÄ²¶»ñ×÷ΪµØͼ»ònil
Èç¹ûûÓÐÕÒµ½²¶»ñ¡£Ñ¡Ôñ:return
¿ÉÒÔÉèÖÃΪ:index
»ñÈ¡Ë÷Òý
Ãû£¨ÕýÔò±í´ïʽ£©
·µ»ØÕýÔò±í´ïʽÖеÄÃû³ÆÁÐ±í¡£
OPTS£¨ÕýÔò±í´ïʽ£©
ÒÔ×Ö·û´®µÄÐÎʽ·µ»ØregexÑ¡Ïî¡£
re_pattern£¨ÕýÔò±í´ïʽ£©
·µ»Ø»ù´¡re_pattern
ÔÚÕýÔò±í´ïʽÖÐ
ÖØбàÒ루ÕýÔò±í´ïʽ£©
Èç¹ûÓбØÒª£¬ÖØбàÒëÏÖÓеÄÕýÔò±í´ïʽ
ÖØбàÒ룡£¨ÕýÔò±í´ïʽ£©
Öع¹ÏÖÓÐÕýÔò±í´ïʽ²¢Òý·¢Regex.CompileError
ÈçÓдíÎó
ÕýÔò±í´ïʽ£¿£¨Ï
·µ»Øtrue
Èç¹û¸ø¶¨term
ÊÇÒ»ÖÖÉóÅС£·ñÔò·µ»Øfalse
Ìæ»»£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ìæ»»£¬Ñ¡Ïî\ []£©
½ÓÊÕregex¡¢¶þ½øÖƺÍÌæ»»£¬·µ»ØÒ»¸öеĶþ½øÖÆ£¬ÆäÖÐËùÓÐÆ¥ÅäÏÓÉÌæ»»Ìæ»»¡£
ÔËÐУ¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
Õë¶Ô¸ø¶¨µÄ×Ö·û´®ÔËÐÐÕýÔò±í´ïʽ£¬Ö±µ½µÚÒ»´ÎÆ¥Åä¡£Ëü·µ»ØÒ»¸ö°üº¬ËùÓⶻñµÄÁбí»òÕßnil
Èç¹ûûÓÐÆ¥Åä·¢Éú
ɨÃ裨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
ͬrun/3
£¬µ«¶à´ÎɨÃèÄ¿±ê£¬ÊÕ¼¯ÕýÔò±í´ïʽµÄËùÓÐÆ¥ÅäÏî¡£
Ô´£¨ÕýÔò±í´ïʽ£©
ÒÔ¶þ½øÖÆÐÎʽ·µ»ØregexÔ´¡£
split£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
¸ù¾Ý¸ø¶¨µÄģʽºÍ¸ø¶¨µÄ²¿¼þÊý²ð·Ö¸ø¶¨µÄÄ¿±ê¡£
°æ£¨£©
·µ»Ø»ù´¡regexÒýÇæµÄ°æ±¾¡£
T£¨£©
t() :: %Regex{opts: binary, re_pattern: term, re_version: term, source: binary}
±àÒ루ԴÂ룬ѡÏî\¡°¡±£©
compile(binary, binary | [term]) :: {:ok, t} | {:error, any}
±àÒëÕýÔò±í´ïʽ¡£
¸ø¶¨µÄÑ¡Ïî¼È¿ÉÒÔÊǶþ½øÖƵģ¬Ò²¿ÉÒÔÊÇ×Ö·û±íʾ¸ø¶¨¸ø~r
ÈçErlangËùÆÚÍûµÄ£¬Sgil»òÑ¡ÏîÁбí:re
Ä£¿é¡£
Ëü»ØÀ´ÁË{:ok, regex}
Èç¹û³É¹¦µÄ»°£¬{:error, reason}
·ñÔò¡£
ʵÀý
iex> Regex.compile("foo")
{:ok, ~r"foo"}
iex> Regex.compile("*foo")
{:error, {'nothing to repeat', 0}}
±àÒ룡£¨À´Ô´£¬Ñ¡Ïî\¡°¡±£©
compile!(binary, binary | [term]) :: t
±àÒëÕýÔò±í´ïʽ²¢Òý·¢Regex.CompileError
ÍòÒ»³ö´í¡£
ÌÓÉú£¨×Ö·û´®£©
escape(String.t) :: String.t
½«×Ö·û´®×ªÒå³ÉÕýÔò±í´ïʽÖеÄÆ¥Åä×Ö·û´®¡£
ʵÀý
iex> Regex.escape(".")
"\\."
iex> Regex.escape("\\what if")
"\\\\what\\ if"
Æ¥Å䣿£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£©
match?(t, String.t) :: boolean
·µ»ØÒ»¸ö²¼¶ûÖµ£¬Ö¸Ê¾ÊÇ·ñÆ¥Åä¡£
ʵÀý
iex> Regex.match?(~r/foo/, "foo")
true
iex> Regex.match?(~r/foo/, "bar")
false
named_captures£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
named_captures(t, String.t, [term]) :: map | nil
½«¸ø¶¨µÄ²¶×½×÷ΪµØͼ·µ»Ø£¬»òÕßnil
Èç¹ûÕÒ²»µ½²¶×½¡£¸ÃÑ¡Ïî:return
¿ÉÒÔÉèÖÃ:index
Ϊ»ñÈ¡Ë÷Òý¡£
ʵÀý
iex> Regex.named_captures(~r/c(?<foo>d)/, "abcd")
%{"foo" => "d"}
iex> Regex.named_captures(~r/a(?<foo>b)c(?<bar>d)/, "abcd")
%{"bar" => "d", "foo" => "b"}
iex> Regex.named_captures(~r/a(?<foo>b)c(?<bar>d)/, "efgh")
nil
Ãû£¨ÕýÔò±í´ïʽ£©
names(t) :: [String.t]
·µ»ØÕýÔò±í´ïʽÖеÄÃû³ÆÁÐ±í¡£
ʵÀý
iex> Regex.names(~r/(?<foo>bar)/)
["foo"]
OPTS£¨ÕýÔò±í´ïʽ£©
opts(t) :: String.t
ÒÔ×Ö·û´®µÄÐÎʽ·µ»ØregexÑ¡Ïî¡£
ʵÀý
iex> Regex.opts(~r(foo)m)
"m"
re_pattern£¨ÕýÔò±í´ïʽ£©
re_pattern(t) :: term
·µ»Ø»ù´¡re_pattern
ÔÚÕýÔò±í´ïʽÖС£
ÖØбàÒ루ÕýÔò±í´ïʽ£©
recompile(t) :: t
Èç¹ûÓбØÒª£¬Öع¹ÏÖÓеÄÕýÔò±í´ïʽ¡£
Õ⽫¼ì²é´æ´¢ÔÚÕýÔò±í´ïʽÖеİ汾£¬²¢ÔÚ°æ±¾²»Æ¥ÅäµÄÇé¿öÏÂÖØбàÒëregex¡£
ÖØбàÒ룡£¨ÕýÔò±í´ïʽ£©
recompile!(t) :: t
Öع¹ÏÖÓÐÕýÔò±í´ïʽ²¢Òý·¢Regex.CompileError
ÍòÒ»³ö´í¡£
ÕýÔò±í´ïʽ£¿£¨Ï
regex?(any) :: boolean
»Ø±¨true
Èç¹û¸ø¶¨term
ÊÇÒ»ÖÖÉóÅС£·ñÔò·µ»Øfalse
...
ʵÀý
iex> Regex.regex?(~r/foo/)
true
iex> Regex.regex?(0)
false
Ìæ»»£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ìæ»»£¬Ñ¡Ïî\ []£©
replace(t, String.t, String.t | (... -> String.t), [term]) :: String.t
½ÓÊÕregex¡¢¶þ½øÖƺÍÌæ»»£¬·µ»ØÒ»¸öжþ½øÖÆ£¬ÆäÖÐËùÓÐÆ¥Å䶼ÓÉÌæ»»Ìæ»»¡£
Ìæ»»¿ÉÒÔÊÇ×Ö·û´®»òº¯Êý¡£¸Ã×Ö·û´®±»ÓÃ×÷ÿ¸öÆ¥ÅäµÄÌæ»»£¬²¢ÇÒËüÔÊÐíͨ¹ý\N
»ò·ÃÎÊÌض¨µÄ²¶×½£¬²¶×½ÔÚ\g{N}
ÄÄÀïN
¡£ÔÚʹÓõÄÇé¿öÏÂ\0
£¬²åÈëÕû¸ö±ÈÈü¡£Çë×¢Ò⣬ÔÚÕýÔò±í´ïʽÖУ¬·´Ð±¸ÜÐèÒª±»×ªÒ壬Òò´Ëʵ¼ÊÉÏÄúÐèҪʹÓÃ\\N
ºÍ\\g{N}
¡£
µ±Ìæ»»ÊÇÒ»¸öº¯Êýʱ£¬¸Ãº¯Êý¿ÉÄܾßÓÐN£¬ÆäÖÐÿ¸ö²ÎÊýÓ³Éäµ½Ò»¸ö²¶»ñ£¬µÚÒ»¸ö²ÎÊýÊÇÕû¸öÆ¥Åä¡£Èç¹ûº¯ÊýÆÚÍûµÄ²ÎÊý±È²¶»ñµÄÒª¶à£¬ÔòÆäÓàµÄ²ÎÊý½«ÊÕµ½¡£""
...
±¸Ñ¡·½°¸
:global
- whenfalse
, replaces only the first occurrence (defaults totrue
) Examplesiex> Regex.replace(~r/d/, "abc", "d") "abc" iex> Regex.replace(~r/b/, "abc", "d") "adc" iex> Regex.replace(~r/b/, "abc", "[\\0]") "a[b]c" iex> Regex.replace(~r/a(b|d)c/, "abcadc", "[\\1]") "[b][d]" iex> Regex.replace(~r/\.(\d)$/, "500.5", ".\\g{1}0") "500.50" iex> Regex.replace(~r/a(b|d)c/, "abcadc", fn _, x -> "[#{x}]" end) "[b][d]" iex> Regex.replace(~r/a/, "abcadc", "A", global: false) "Abcadc"run(regex, string, options \ [])run(t, binary, [term]) :: nil | [binary] | [{integer, integer}]Runs the regular expression against the given string until the first match. It returns a list with all captures ornil
if no match occurred.Options
:return
-É趨Ϊ:index
·µ»ØË÷Òý¡£Ä¬ÈÏΪ:binary
...
:capture
- ÔÚ½á¹ûÖÐÒª²¶»ñʲô¡£¼ì²émoduledocRegex
ÒԲ鿴¿ÉÄܵIJ¶»ñÖµ¡£
ʵÀý
iex> Regex.run(~r/c(d)/, "abcd")
["cd", "d"]
iex> Regex.run(~r/e/, "abcd")
nil
iex> Regex.run(~r/c(d)/, "abcd", return: :index)
[{2, 2}, {3, 1}]
ɨÃ裨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
scan(t, String.t, [term]) :: [[String.t]]
ͬrun/3
£¬µ«ÊǶà´ÎɨÃèÄ¿±ê£¬ÊÕ¼¯ÕýÔò±í´ïʽµÄËùÓÐÆ¥Åä¡£
·µ»ØÁбíÁÐ±í£¬ÆäÖÐÖ÷ÁбíÖеÄÿ¸öÌõÄ¿±íʾƥÅ䣬´ÎÁбíÖеÄÿ¸öÌõÄ¿±íʾ²¶»ñµÄÄÚÈÝ¡£
±¸Ñ¡·½°¸
:return
-É趨Ϊ:index
·µ»ØË÷Òý¡£Ä¬ÈÏΪ:binary
...
:capture
-´Ó½á¹ûÖеõ½Ê²Ã´¡£¼ì²éÄ£×éRegex
ÈôÒª²é¿´¿ÉÄܵIJ¶»ñÖµ£¬ÇëÖ´ÐÐÒÔϲÙ×÷¡£
ʵÀý
iex> Regex.scan(~r/c(d|e)/, "abcd abce")
[["cd", "d"], ["ce", "e"]]
iex> Regex.scan(~r/c(?:d|e)/, "abcd abce")
[["cd"], ["ce"]]
iex> Regex.scan(~r/e/, "abcd")
[]
iex> Regex.scan(~r/\p{Sc}/u, "$, ?, and €")
[["$"], ["?"], ["€"]]
Ô´£¨ÕýÔò±í´ïʽ£©
source(t) :: String.t
ÒÔ¶þ½øÖÆÐÎʽ·µ»ØregexÔ´¡£
ʵÀý
iex> Regex.source(~r(foo))
"foo"
split£¨ÕýÔò±í´ïʽ£¬×Ö·û´®£¬Ñ¡Ïî\ []£©
split(t, String.t, [term]) :: [String.t]
¸ù¾Ý¸ø¶¨µÄģʽºÍ¸ø¶¨µÄ²¿¼þÊý²ð·Ö¸ø¶¨µÄÄ¿±ê¡£
±¸Ñ¡·½°¸
:parts
-Ö¸¶¨Ê±£¬½«×Ö·û´®²ð·ÖΪ¸ø¶¨ÊýÁ¿µÄ²¿¼þ¡£Èç¹ûûÓоßÌå˵Ã÷£¬:parts
ĬÈÏΪ:infinity
£¬Ëü½«¸ù¾Ý¸ø¶¨µÄģʽ½«×Ö·û´®²ð·ÖΪ¾¡¿ÉÄܶàµÄ²¿·Ö¡£
:trim
- ºÎʱtrue
£¬""
´Ó½á¹ûÖÐɾ³ý¿Õ×Ö·û´®£¨£©¡£
:on
-Ö¸¶¨Òª²ð·Ö×Ö·û´®µÄ²¶»ñÄÚÈÝ£¬ÒÔ¼°°´Ê²Ã´Ë³Ðò½øÐвð·Ö¡£Ä¬ÈÏΪ:first
ÕâÒâζ×ÅÕýÔò±í´ïʽÖеIJ¶»ñ²»Ó°Ïì²ð·Ö¹ý³Ì¡£
:include_captures
-ºÎʱtrue
£¬ÔÚ½á¹ûÖаüÀ¨ÕýÔò±í´ïʽµÄÆ¥Å䡣ĬÈÏΪfalse
...
ʵÀý
iex> Regex.split(~r{-}, "a-b-c")
["a", "b", "c"]
iex> Regex.split(~r{-}, "a-b-c", [parts: 2])
["a", "b-c"]
iex> Regex.split(~r{-}, "abc")
["abc"]
iex> Regex.split(~r{}, "abc")
["a", "b", "c", ""]
iex> Regex.split(~r{a(?<second>b)c}, "abc")
["", ""]
iex> Regex.split(~r{a(?<second>b)c}, "abc", on: [:second])
["a", "c"]
iex> Regex.split(~r{(x)}, "Elixir", include_captures: true)
["Eli", "x", "ir"]
iex> Regex.split(~r{a(?<second>b)c}, "abc", on: [:second], include_captures: true)
["a", "b", "c"]
°æ£¨£©
·µ»Ø»ù´¡RegexÒýÇæµÄ°æ±¾¡£
±¾ÎĵµÏµÌÚѶÔÆ¿ª·¢ÕßÉçÇø³ÉÔ±¹²Í¬Î¬»¤£¬ÈçÓÐÎÊÌâÇëÁªÏµ cloudcommunity@tencent.com