0

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

Eg1:源字符串 1:www.example.com#blue?something=x
我的期望:蓝色

Eg2:源字符串 2:www.example.com#blue&something=x
我的期望:蓝色

Eg3:源字符串 3:www.example.com#blue
我的期望:蓝色

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

Eg5:源字符串 5:www.example.com
我的期望:“”

4

3 回答 3

2

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

可悲的是,JS 正则表达式不支持后向断言,我们被简化为:

var match = (input.match(/#[a-z]+/) || [""])[0].substr(1);
于 2013-03-02T01:17:21.643 回答
0

这些 URL 不是...特别有效(?#? 之后),但如果它们是,您可以从 URL 创建一个 Location 对象并用于locationObject.hash获取#. 作为字符串:

str.match(/#([a-z]+)/i)[1];
于 2013-03-02T01:16:37.060 回答
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] || "";
}

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

PS如果你真的只对字母感兴趣,你可以[^?&][A-Za-z]. 但是,通过这种方式,您将不会匹配 URL,例如 www.example.com#blue12&something=x两者www.example.com#blue_and_green&something=x。如果有这个意图,可以更换。否则,keep[^?&]会匹配所有不是?or的字符&,所以会更通用。

于 2013-03-02T01:33:09.167 回答