为什么需要在此Elixir正则表达式中转义某些字符?

时间:2017-02-18 18:18:30

标签: regex erlang elixir pcre

我的最终目标是在JavaScript中编写一个函数,它将逃避Erlang中的所有正则表达式元字符。因为我想使用PouchDB和$regex通过我的HTML5应用程序为CouchDB 2构建一个Mango pouchdb-find查询。我想在我的数据库中的对象上的字段中搜索子字符串,如果我可以帮助它并且不需要该工具,则无需设置couchdb-lucene

在写这个逃避函数时,我发现Elixir有already written one

{:ok, pattern} = :re.compile(~S"[.^$*+?()\[\]{}\\\|\s#-]", [:unicode])
@escape_pattern pattern

@spec escape(String.t) :: String.t
def escape(string) when is_binary(string) do
  :re.replace(string, @escape_pattern, "\\\\&", [:global, {:return, :binary}])
end

我想弄清楚如何将这个表达式翻译成JavaScript,在这个过程中,我试图理解Elixir和Erlang的正则表达式语法,我理解这是基于PCRE。

转义[]字符足够有意义,因为它们本身就在括号中。与\一样,因为它是一个转义字符。

但为什么\|\s会被转义?

1 个答案:

答案 0 :(得分:0)

正如Lucas Trzesniewski和Dogbert在评论中推断的那样,\|不需要被转义,\s被转义,因为如果正则表达式有x标志,任何未转义的空格被忽略,因此转义空格将始终具有有效的正则表达式,而不依赖于x标志是否存在:{"a b" =~ ~r/a b/, "a b" =~ ~r/a b/x, "a b" =~ ~r/a\ b/x} #=> {true, false, true}

这是我最终获得的逃避功能:

function escapeRegex (string) {
  return string.replace(/([.^$*+?()\[\]{}\\\s#-])/g, '\\$&');
}