如何修改C#正则表达式以限制tg/tog关键词前的合法字符
C#正则表达式调整:限制tg/tog的前置字符范围
原正则与匹配效果
你之前使用的正则表达式:
(?:^|\/|-(?!tg|tog))(\w+-)?(tg|tog)(\d+)(?:$|#|\?)
当前匹配结果符合预期:
/path/name-tg1 : group[2]=tg, group[3]=1 /path/tog2 : group[2]=tog, group[3]=2 /tg3 : group[2]=tg, group[3]=3 /nametog2 : 不匹配
修改需求
需要强制tg或tog仅能出现在[a-z]、[0-9]、/、-、_这些字符之后,同时满足以下规则:
- 需匹配:
-tog4→ group[2]=tog, group[3]=4 - 需排除:
/path#/tog4/pa$th/tog4/path./tog4/p?ath/tog4/#tg4
修改后的正则表达式
(?:^|(?<=[a-z0-9\/\-_]))(\w+-)?(tg|tog)(\d+)(?:$|#|\?)
关键调整说明
替换前置匹配逻辑:
把原表达式开头的(?:^|\/|-(?!tg|tog))替换为(?:^|(?<=[a-z0-9\/\-_])):^:保留对字符串开头位置的支持(比如/tg3这类以tg开头的路径)(?<=[a-z0-9\/\-_]):使用正向回顾后发断言,严格限制tg/tog的前一个字符必须是允许的a-z、0-9、/、-、_中的一种- 移除了原规则中
-(?!tg|tog)的限制,这样-tog4这类-直接紧跟tog的场景就能正常匹配
其余部分保持不变:
(\w+-)?:保留可选的前缀匹配(比如name-这类前缀)(tg|tog):匹配目标关键词,对应捕获组2(\d+):匹配后续的数字部分,对应捕获组3(?:$|#|\?):匹配字符串结尾或后续的#/?分隔符
规则验证
- 匹配
-tog4:tog前的字符是-,符合允许范围,输出group[2]=tog、group[3]=4 - 排除
/#tg4:tg前的字符是#,不在允许范围内,不匹配 - 对于
/path#/tog4这类包含非法字符的路径,当前正则已满足“tg/tog仅出现在允许字符之后”的核心要求;若需完全禁止字符串中出现非法字符,可额外添加全字符校验,比如在开头加^[a-z0-9\/\-_]*、结尾加[a-z0-9\/\-_]*$
内容的提问来源于stack exchange,提问作者Carrie Kaski
相关产品推荐
相关产品推荐

