如何使用Go正则表达式匹配带多个连字符的字母数字序列号?
正则表达式编写方案
问题原因
- 原有正则没有使用
^和$锚点,只要字符串中存在符合规则的子串就会返回true,不会校验整个字符串的格式 - 没有指定每段字符的长度为4,也没有控制连字符的位置,无法避免末尾出现多余连字符的情况
正确正则说明
如果要完全匹配示例格式A12T-4GH7-QPL9-3N4M(固定4段,每段4位字母数字,段间用连字符分隔,首尾无连字符),使用如下正则:^[a-zA-Z0-9]{4}(-[a-zA-Z0-9]{4}){3}$
各部分含义:
^匹配字符串开头[a-zA-Z0-9]{4}匹配4位字母或数字(-[a-zA-Z0-9]{4}){3}匹配3次「连字符+4位字母数字」的组合,对应剩余的3段内容$匹配字符串结尾
如果需要支持任意数量的段落(至少1段),可以把{3}改成*,正则为^[a-zA-Z0-9]{4}(-[a-zA-Z0-9]{4})*$。如果序列号只允许大写字母,去掉正则里的a-z即可;如果需要不区分大小写,也可以在正则开头加(?i)标志,简化写法为^(?i)[0-9A-Z]{4}(-[0-9A-Z]{4}){3}$。
修正后代码示例
package main import ( "fmt" "regexp" ) func main() { // 固定4段的匹配规则 re := regexp.MustCompile(`^[a-zA-Z0-9]{4}(-[a-zA-Z0-9]{4}){3}$`) // 测试用例 testCases := []string{ "A12T-4GH7-QPL9-3N4M", // 符合格式,返回true "A12T-A12T", // 只有2段,返回false "A12T-A12T-", // 末尾有多余连字符,返回false "a12t-4gh7-qpl9-3n4m", // 小写也符合,返回true } for _, s := range testCases { fmt.Printf("%s 匹配结果:%t\n", s, re.MatchString(s)) } }
内容的提问来源于stack exchange,提问作者Brett La Pierre
相关产品推荐
相关产品推荐

