如何用正则限制URL中?和#在整串最多出现一次?
验证URL中
?和#字符出现次数的解决方案 方法一:正则表达式匹配
直接用正则校验整个URL字符串,确保?和#各自最多出现一次,同时符合URL规范(锚点#需在查询参数?之后,若两者都存在)。
正则表达式示例:
^[^?#]*(\?[^#]*)?(#.*)?$
规则解释:
^[^?#]*:匹配开头到第一个?或#前的所有字符,确保前缀无违规符号(\?[^#]*)?:可选的查询参数段,?后不能再出现#,且整个?段最多出现一次(#.*)?:可选的锚点段,#仅能出现一次,且需在?之后(若存在?)$:匹配字符串结尾,杜绝多余的?或#
JavaScript实现示例:
function isValidUrl(url) { const regex = /^[^?#]*(\?[^#]*)?(#.*)?$/; return regex.test(url); } // 测试用例 console.log(isValidUrl("https://example.com/go?somewhere=there?this=isbad#anchor1#anchor2")); // false console.log(isValidUrl("https://example.com/go?somewhere=there#anchor1")); // true console.log(isValidUrl("https://example.com/go#anchor1")); // true
方法二:手动统计字符
如果不想依赖正则,可直接统计?和#的出现次数,还能额外校验URL的规范逻辑(锚点需在查询参数之后)。
Python实现示例:
def is_valid_url(url): question_count = url.count('?') hash_count = url.count('#') # 先检查次数是否超标 if question_count > 1 or hash_count > 1: return False # 若两者都存在,校验顺序是否合规 if '?' in url and '#' in url: return url.index('?') < url.index('#') return True // 测试用例 print(is_valid_url("https://example.com/go?somewhere=there?this=isbad#anchor1#anchor2")) # False print(is_valid_url("https://example.com/go#anchor1?param=1")) # False(#在?前,不符合规范) print(is_valid_url("https://example.com/go")) # True
补充说明
- 两种方法都能满足核心需求:限制
?和#各自仅出现一次 - 若不需要校验
#和?的顺序,可删除方法二中的顺序判断逻辑 - 可根据所用编程语言调整实现细节,核心逻辑一致
内容的提问来源于stack exchange,提问作者mateoc15
相关产品推荐
相关产品推荐

