带标签的正则表达式\ t

时间:2018-06-19 11:31:20

标签: regex elixir

我正在尝试将命名的正则表达式应用到字符串中,该字符串的字段由制表符分隔,但无法弄清楚该怎么做。

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中的特殊字符,因此我不确定是否可以这样做

1 个答案:

答案 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