正则表达式校验需求:确保{}内元素无空值且由|分隔
正则表达式解决方案:校验无空元素的花括号分隔格式
嘿,我来帮你搞定这个正则校验的问题!你的核心需求很明确:要匹配{元素1|元素2|...|元素n}这种格式,要求每个元素都是[A-Z0-9-_.*](我猜你原正则里的0-1是笔误,应该是0-9?如果确实只允许0和1,改回01就行)范围内的字符,绝对不能有空元素——不管是首尾的|,还是中间连续的|都不行,同时还要支持单个元素的情况(比如{A})。
最终可用的正则表达式
^\{([A-Z0-9-_.*]+(?:\|[A-Z0-9-_.*]+)*)\}$
如果不需要捕获花括号内的内容,把捕获组改成非捕获组即可:
^\{(?:[A-Z0-9-_.*]+(?:\|[A-Z0-9-_.*]+)*)\}$
正则拆解(帮你理解每一部分的作用)
^和$:锚定整个字符串,确保输入完全符合格式,不会出现部分匹配的情况(比如不会把xxx{A}xxx当成合法输入)\{和\}:匹配字面量的{和},因为这两个是正则的特殊元字符,必须转义才能匹配本身- 核心匹配部分
[A-Z0-9-_.*]+(?:\|[A-Z0-9-_.*]+)*:[A-Z0-9-_.*]+:匹配至少一个合法字符,保证单个元素非空(?:\|[A-Z0-9-_.*]+)*:这是一个非捕获组,允许0次或多次重复|+合法元素的结构。*的作用很关键:当只有单个元素时,这部分完全不匹配,刚好满足{A}的场景;当有多个元素时,每次重复都会确保|后面跟着非空的合法元素,从根源上杜绝了空元素的出现。
你的原正则问题出在哪?
你之前用的正则(?: ( \{{1} (?:[A-Z0-1-_.*]+ \| [A-Z0-1-_.*]+)* \}{1} ) )有两个致命问题:
- 内部的
(?:[A-Z0-1-_.*]+ \| [A-Z0-1-_.*]+)*要求每次匹配都是「元素|元素」的结构,这就导致至少需要两个元素才能匹配,自然无法识别单个元素的{A} - 虽然原正则不会匹配首尾带
|的情况,但核心逻辑限制了元素数量,这是最主要的问题
测试用例参考
- ✅ 合法输入(会被匹配):
{A}{A|B}{A-B.*9|Z_0}
- ❌ 非法输入(会被拒绝):
{A|}(末尾空元素){|B}(开头空元素){A||B}(中间空元素){}(空内容)A|B(缺少花括号包裹){a}(小写字母不在合法范围)
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

