需求:匹配仅含单下划线的[]/{}包裹字符串的正则表达式
精确匹配目标格式的正则表达式方案
嘿,我来帮你搞定这个正则需求!你需要的是严格匹配以[]或{}包裹、内部仅含单个下划线且前后均为非下划线字符的字符串,原正则的问题在于.+会贪婪匹配包括下划线在内的任意字符,导致无法限制下划线数量。下面是完善后的方案:
最终正则表达式
^([\[{])(?:[^_]+_[^_]+)\1$
如果觉得捕获分组的写法有点绕,也可以拆分成更直观的版本:
^\[(?:[^_]+_[^_]+)\]$|^\{(?:[^_]+_[^_]+)\}$
正则规则拆解
咱们逐个部分解释,帮你理解为什么这个正则能满足所有要求:
^和$:锚定字符串的开头和结尾,确保整个字符串完全符合格式,避免匹配到包含目标格式的长字符串(比如排除1Ab_23c这种无包裹符的情况)([\[{]):捕获分组,匹配开头的[或{,后续用\1引用这个分组,保证结尾的包裹符和开头完全一致(直接排除{1Ab_23c]这种包裹符不匹配的错误格式)(?:[^_]+_[^_]+):非捕获分组,核心规则所在:[^_]+:匹配1个或多个不含下划线的字符,对应你要求的foo部分(长度至少1)_:匹配单个下划线,严格保证仅出现一次- 第二个
[^_]+:同样匹配1个或多个不含下划线的字符,对应bar部分(长度至少1)
\1:引用开头捕获的包裹符,确保结尾是]或},和开头的包裹符一一对应
匹配验证
符合要求的匹配项
[1Ab_23c]{abcDefGhjk_Z}{1_abcDefGhjk}
被正确排除的不匹配项
{1Ab_23c](包裹符前后不一致){_1Abde_fg4567_2_}(存在多个下划线,且foo部分为空){1Abde_fg4567_2}(存在多个下划线)1Ab_23c(无包裹符)
可选扩展
如果需要限制foo和bar只能是字母数字,可以把[^_]替换为[a-zA-Z0-9],正则会变成:
^([\[{])(?:[a-zA-Z0-9]+_[a-zA-Z0-9]+)\1$
内容的提问来源于stack exchange,提问作者iamkenos
相关产品推荐
相关产品推荐

