如何编写正则表达式判断整个字符串是否为占位符
如何判断整个字符串是否为单个占位符(支持嵌套)
需求说明
需要正则表达式判断整个字符串是否是单个合法占位符:
- 有效占位符:
${var}、${var-${nestedVar}}(支持嵌套) - 无效场景:占位符仅为字符串一部分,如
${var}-sometext、${var1}-txt-${var2}
当前正则的问题
原正则^\$\{(.+)\}$存在缺陷:
- 常规场景能正常匹配,但遇到
${var1}-txt-${var2}时会错误匹配——因为.+是贪婪匹配,会直接匹配到最后一个},忽略中间的非占位符内容;若替换为[^$]+,又会无法识别嵌套占位符(因为嵌套里的$会被视为终止符)。
解决方案:递归匹配嵌套结构
Java正则支持通过平衡组递归实现嵌套结构的匹配,正确的正则如下:
public static final Pattern PATTERN = Pattern.compile("^\\$\\{(?:[^\\$\\}]|\\$\\{(?:(?1))\\})+\\}$");
正则逻辑拆解
^和$:严格匹配整个字符串,避免部分匹配\$\{:匹配占位符起始标记${(?:[^\\$\\}]|\\$\\{(?:(?1))\\})+:核心匹配规则(非捕获组,避免多余捕获)[^\$\}]:匹配普通字符(非$和})\$\{(?:(?1))\}:递归匹配内部嵌套的占位符结构((?1)引用当前组的匹配规则,实现嵌套识别)+:确保占位符内部至少有有效内容
\}:匹配占位符结束标记}
测试验证
${var}:匹配成功 ✅${var} txt:匹配失败 ✅${var-${nestedVar}}:匹配成功 ✅${var1}-txt-${var2}:匹配失败 ✅
内容的提问来源于stack exchange,提问作者SatheeshJM
相关产品推荐
相关产品推荐

