技术需求:提取URL中从首个斜杠到#后首个斜杠前的内容
正则提取URL指定片段方案
需求说明
给定一组URL,需提取域名后首个斜杠开始的纯路径部分,加上#后到首个斜杠前的锚点内容,具体示例如下:
原始URL示例
https://www.blablabla.com/one/two/?landingPageType=PASSENGER&locale=es_ES&mktport[…]eItineraryKey=99,1A&segmentKey0=0,UX6012&segmentKey1=0,UX6079#details/11723993857/ https://www.blablabla.com/foo/bar/test/#test_a https://www.blablabla.com/foo/bar/test/#test_a/45345/43
预期提取结果
/one/two/#details /foo/bar/test/#test_a /foo/bar/test/#test_a
正则实现方案
使用以下正则表达式配合替换操作,即可精准提取目标内容:
正则表达式
^https?://[^/]+(/[^?#]*)(?:\?[^#]*)?(#[^/]+)?(?:/.*)?$
替换规则
将匹配到的完整URL替换为 $1$2(即第一个捕获组与第二个捕获组的内容拼接)。
正则逻辑拆解
^https?://:匹配URL开头的http://或https://协议部分[^/]+:匹配完整域名(从协议结束到第一个斜杠的所有字符)(/[^?#]*):第一个捕获组,提取域名后的纯路径:/:定位域名后的首个斜杠[^?#]*:匹配从斜杠到?或#前的所有字符(排除查询参数和锚点)
(?:\?[^#]*)?:非捕获组,匹配并跳过可选的查询参数(?到#之间的内容)(#[^/]+)?:第二个捕获组,提取有效锚点内容:#:定位锚点起始符号[^/]+:匹配#后到下一个斜杠前的所有字符(无后续斜杠则匹配到URL结尾)
(?:/.*)?:非捕获组,匹配并跳过锚点后的后续路径内容
验证效果
对每个原始URL应用上述规则后:
- 第一个URL:捕获组1为
/one/two/,捕获组2为#details,拼接后得到/one/two/#details - 第二个URL:捕获组1为
/foo/bar/test/,捕获组2为#test_a,拼接后得到/foo/bar/test/#test_a - 第三个URL:捕获组1为
/foo/bar/test/,捕获组2为#test_a,拼接后得到/foo/bar/test/#test_a
完全符合预期结果。
内容的提问来源于stack exchange,提问作者Naiade
相关产品推荐
相关产品推荐

