如何编写C#正则表达式:允许指定字符但禁止重复斜杠
修改后的正则表达式
直接替换原正则即可,两种写法逻辑等价,任选其一:
写法一(结构清晰,易读性高):
var objectKeyRegex = new Regex(@"^(?:[a-zA-Z0-9!.*'()_-]+|\/(?!\/))*$");
写法二(紧凑简洁):
var objectKeyRegex = new Regex(@"^(?:(?!\/\/)[a-zA-Z0-9!.*'()_/-])*$");
改动逻辑说明
原正则把/和其他合法字符放在同一字符集,导致允许连续匹配多个/。要实现需求,核心是确保永远不会出现两个及以上的/连在一起,同时保留单个/的合法性,且不限制其他合法字符的使用。
写法一拆解:
[a-zA-Z0-9!.*'()_-]+:匹配一段不含斜杠的合法字符(至少1个)\/(?!\/):匹配单个斜杠,通过(?!\/)负向预查确保当前斜杠后不会紧跟另一个斜杠(?:...|...)*:将上述两种模式组合,允许任意次数重复(包括零次),覆盖所有合法的字符组合场景
写法二拆解:
(?!\/\/):负向预查,检查当前位置开始的两个字符不是//[a-zA-Z0-9!.*'()_/-]:匹配单个合法字符^(?:...)*$:让上述组合覆盖整个字符串,从根源上杜绝连续斜杠的出现
验证用例
- 合法匹配:
abc123!_.-(/'*、a/b/c、/start、end/ - 非法匹配:
a//b、///test、abc//
内容的提问来源于stack exchange,提问作者JHJ
相关产品推荐
相关产品推荐

