我的最终目标是在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
会被转义?
答案 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, '\\$&');
}