使用REGEXP_SUBSTR如何提取指定模式后由数字和点组成的版本号
你之前写的正则之所以匹配到了1.2.3.4,是因为没有锚定指定的前缀,正则会直接返回整段文本里第一个符合\d+[^a-z"]+规则的内容,刚好就是abcVersion对应的值。
要精准匹配xyzVersion" : "后的版本号,可以用两种方案,适配不同数据库的正则支持情况:
方案1:后行断言(适合支持后行断言的数据库,如MySQL8.0+、PostgreSQL、Oracle11g+)
直接通过后行断言锚定前缀,匹配结果不会包含前缀内容:
REGEXP_SUBSTR(`column`, '(?<=xyzVersion" : ")[0-9.]+') AS result
(?<=xyzVersion" : ")是后行断言规则,只会匹配前面恰好是指定前缀的位置[0-9.]+仅匹配连续的数字和点,完全符合目标版本号的格式要求
方案2:分组替换(兼容性更好,适配所有支持正则替换的数据库)
如果你的数据库不支持后行断言,可以先捕获目标内容,再替换掉其他无关部分:
REGEXP_REPLACE(`column`, '.*xyzVersion" : "([0-9.]+).*', '$1') AS result
逻辑是通过分组([0-9.]+)捕获你要的版本号,再把整段文本替换为分组1的内容,只会返回前缀后的目标版本号,不会匹配到其他版本字段的值。
内容的提问来源于stack exchange,提问作者Tobitor
相关产品推荐
相关产品推荐

