如何编写正则表达式:下划线后为字母数字混合时取其前内容,否则全匹配
正则表达式匹配需求与解决方案
原始输入字符串
ab_cd ef_gh_ij kl_mn_op_qr st_uv_1w2x yz_ab_cd_e1f2
匹配需求
匹配每个字符串中最后一个下划线(_)之前的子串(不包含下划线),但仅当该下划线后跟随的是同时包含字母和数字的字母数字序列时;否则直接匹配整个字符串。
预期匹配结果
ab_cd ef_gh_ij kl_mn_op_qr st_uv yz_ab_cd
当前问题
使用正则表达式 ^.*(?=_)[a-zA-z]+ 无法满足需求:对于下划线后为字母数字混合的情况,该表达式会错误匹配下划线本身及后续一个字符。
解决方案
可以使用以下正则表达式实现需求:
^(.*)(?=_(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+)$|^.*$
表达式解释
- 第一部分
^(.*)(?=_(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+)$:(?=_(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+)是正向预查,用于验证字符串结尾是否存在一个下划线,且下划线后的字母数字序列同时包含至少一个字母和一个数字;(.*)捕获该下划线之前的所有内容作为匹配结果。
- 第二部分
|^.*$:当字符串不满足上述条件时,直接匹配整个字符串。
内容的提问来源于stack exchange,提问作者OfirD
相关产品推荐
相关产品推荐

