需要正则表达式才能将所有字母表从#字母转换为非字母表

时间:2013-03-02 01:11:00

标签: javascript regex

如何编写regexp以将location.href中#的所有字母表转换为非字母表。

  

Eg1:源字符串1:www.example.com #blue?something = x
我是什么   期待:蓝色

     

Eg2:源字符串2:www.example.com #blue& something = x
我是什么   期待:蓝色

     

Eg3:Source String 3:www.example.com#blue
我的期望:蓝色

     

Eg4:源字符串4:www.example.com#?something = x
我的期望:“”

     

Eg5:Source String 5:www.example.com
我的期望:“”

3 个答案:

答案 0 :(得分:2)

在任何明智的语言中,它都像/(?<=#)[a-z]+/

一样简单

可悲的是,JS regexes不支持lookbehind断言,我们沦为这个:

var match = (input.match(/#[a-z]+/) || [""])[0].substr(1);

答案 1 :(得分:0)

这些网址不是......特别有效(?之后的#?),但如果是,您可以从网址创建一个位置对象并使用locationObject.hash来获取#。作为字符串:

str.match(/#([a-z]+)/i)[1];

答案 2 :(得分:0)

请注意,URI语法为:

scheme ":" hier-part [ "?" query ] [ "#" fragment ]

(有关详细信息,请参阅RFC 3986

因此,在您的示例中,#blue?something=x是片段,并且没有查询字符串。在哪里,如果形成得当:

www.example.com?something=x#blue

您有?something作为查询,#blue作为片段。测试:

var a = document.createElement("a");
a.href = "http://www.example.com#blue?something=x"

console.log(a.hash, a.search);

a.href = "http://www.example.com?something=x#blue"

console.log(a.hash, a.search);

首先,你必须检查你发布的URI是否是你想要的,因为它们看起来不是很好。

说,如果例子是正确的,你可以使用类似的东西:

function getFragment(s) {
   var v = s.match(/#([^?&]+)/);
   return v ? v[1] : "";
}

或者:

function getFragment(s) {
    return [].concat(s.match(/#([^?&]+)/))[1] || "";
}

但在我看来,可读性较差。

P.S。 如果您真的只对字母表感兴趣,可以将[^?&]替换为[A-Za-z]。但是,通过这种方式,您不会将www.example.com#blue12&something=x之类的网址与www.example.com#blue_and_green&something=x匹配。如果有意图,可以更换。否则,保持[^?&]将匹配所有不是?&的字符,因此它会更通用。