如何匹配仅以单个下划线开头的字符串并输出时去掉该下划线
正则表达式调整方案
问题原因
你原来的正则(?<=_)[a-zA-Z0-9]+存在两个核心问题:
- 仅校验了目标内容前有1个下划线,但没有排除下划线前还有其他下划线的情况,所以会匹配到
__invalidVariable中第二个下划线后的内容 - 没有校验目标内容的尾部边界,会误匹配到尾部带下划线的
_evenMoreInvalidVariable_的中间内容
调整后正则
直接使用下面的正则,取第1个捕获组的内容即可得到去掉前导下划线的结果:
\b_([a-zA-Z0-9]+)\b
如果你的正则环境支持可变长度零宽后顾,也可以直接匹配到目标内容不需要取捕获组:
(?<=\b_)[a-zA-Z0-9]+\b
匹配逻辑说明
- 开头的
\b是单词边界,因为下划线属于正则定义的单词字符,两个连续下划线之间不会产生单词边界,所以\b_就确保了匹配的下划线是单个前导下划线,前面不会有其他下划线,直接排除了__invalidVariable这类多下划线开头的情况 - 中间的
([a-zA-Z0-9]+)是捕获组,匹配我们需要的字母数字组合内容 - 结尾的
\b确保匹配内容的尾部是单词边界,排除了尾部带下划线的无效变量 - 最终输出直接取捕获组1的内容,自动省略了前导的下划线,不需要额外做字符串处理
效果验证
对输入文本执行匹配后,得到的匹配结果依次为area、perfectRectangle、id、age、validVariable,按原文本行分组后和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者prsnr
相关产品推荐
相关产品推荐

