如何使用#作为CoffeeScript heregex的一部分?

时间:2012-02-29 02:54:01

标签: regex coffeescript

我正在尝试匹配jQuery Mobile URL的哈希片段,如下所示:

    matches = window.location.hash.match ///
        #                   # we're interested in the hash fragment
        (?:.*/)?            # the path; the full page path might be /dir/dir/map.html, /map.html or map.html
                            # note the path is not captured
        (\w+\.html)$        # the name at the end of the string
        ///

然而,问题是#符号会从编译的JS文件中的正则表达式中删除,因为它被视为注释的开头。我知道我可以切换到正常的正则表达式,但有没有办法在heregex中使用#?

2 个答案:

答案 0 :(得分:5)

以通常的方式逃脱:

matches = window.location.hash.match ///
    \#                  # we're interested in the hash fragment
    (?:.*/)?            # the path; the full page path might be /dir/dir/map.html, /map.html or map.html
                        # note the path is not captured
    (\w+\.html)$        # the name at the end of the string
    ///

这将编译为此正则表达式:

/\#(?:.*\/)?(\w+\.html)$/

\#与JavaScript正则表达式中的#相同。

您还可以使用Unicode转义\u0023

matches = window.location.hash.match ///
    \u0023              # we're interested in the hash fragment
    (?:.*/)?            # the path; the full page path might be /dir/dir/map.html, /map.html or map.html
                        # note the path is not captured
    (\w+\.html)$        # the name at the end of the string
    ///

但是很少有人会将\u0023识别为哈希符号,因此\#可能是更好的选择。

答案 1 :(得分:3)

在这里实施。使用简单的正则表达式(/\s+(?:#.*)?/g)将heregex注释与空白一起删除,因此#之前的任何非空白字符(或者在开头放置它)都可以。

$ coffee -bcs
  /// [#] ///                      
  /// (?:#) ///
  ///#///       

// Generated by CoffeeScript 1.2.1-pre
/[#]/;

/(?:#)/;

/#/;