我正在尝试将命名的正则表达式应用到字符串中,该字符串的字段由制表符分隔,但无法弄清楚该怎么做。
test = "2018-06-16T07:03:23.813056Z\thello\tworld"
Regex.named_captures(~r/(?<foo>)\\t(?<hello>)\\t(?<world>)/, test)
nil
标签是文档http://erlang.org/documentation/doc-5.7.4/lib/stdlib-1.16.4/doc/html/regexp.html中的特殊字符,因此我不确定是否可以这样做
答案 0 :(得分:1)
在模式中,您定义了命名组,它们不捕获任何字符,只是空字符串。 (?<foo>)
匹配并捕获一个空字符串。现在,您的模式中的\\t
与文字反斜杠匹配,后跟字母t
。因此,~r/(?<foo>\\t)/
将在~S(2018-06-16T07:03:23.813056Z\thello)
(其中没有选项卡的2018-06-16T07:03:23.813056Z\thello
字符串)中找到匹配项。
此外,如果您使用字符串文字的构造函数构建正则表达式,则可以两种方式定义制表符,分别为"\t"
和"\\t"
。前者将作为原义TAB字符传递给regex引擎,而在后一种情况下,将传递与原义\
和t
组成的正则表达式转义符,以匹配相同的TAB字符。 Regex.compile!("(?<foo>\t)")
= Regex.compile!("(?<foo>\\t)")
。
您实际上可以将非制表符块与[^\t]*
匹配:
~r/(?<foo>[^\t]*)\t(?<hello>[^\t]*)\t(?<world>[^\t]*)/
^^^^^^ ^^^^^^ ^^^^^^
如果您只想将该模式作为整个字符串进行匹配,请用^
和$
括起来:
~r/^(?<foo>[^\t]*)\t(?<hello>[^\t]*)\t(?<world>[^\t]*)$/
^ ^
[^\t]*
是一个与字符匹配的否定字符类,除了制表符外,匹配0次或更多次(*
是一个贪婪的量词,它匹配0次或更多次连续出现的量化子模式)。
请参见online demo。