正则非贪婪匹配:如何提取最后一个‘-’与‘@’间的目标内容?
提取message_id中最后一个'-'与'@'之间的内容
给定字符串:
message_id = "7bb19406-f97a-47b3-b42c-40868d2cef5b-1661496224@example.com"
需求是提取最后一个-与@之间的内容,即1661496224。当前使用的正则/(?<=\-).*(?=\@)/会匹配第一个-到@之间的所有内容,结果不符合预期。
解决方案
以下几种方法可以实现目标:
方法1:使用捕获组匹配(推荐)
通过正则捕获最后一个-到@之间的内容,代码如下:
message_id = "7bb19406-f97a-47b3-b42c-40868d2cef5b-1661496224@example.com" result = message_id.match(/-([^@]+)@/)[1] puts result # 输出:1661496224
正则说明:-匹配最右侧的短横线(正则默认贪婪匹配,会优先匹配最后一个符合条件的-),([^@]+)捕获所有非@的字符直到遇到@,通过[1]直接获取捕获到的目标内容。
方法2:调整正向反向预查正则
修改正则规则,匹配不含-的内容,避免跨过多短横线:
message_id = "7bb19406-f97a-47b3-b42c-40868d2cef5b-1661496224@example.com" result = message_id.match(/(?<=-)[^-]*(?=@)/)[0] puts result # 输出:1661496224
正则说明:(?<=-)确保匹配内容前是-,[^-]*匹配任意非-的字符(自然停在最后一个-之后),(?=@)确保匹配内容后是@。
方法3:字符串分割法
无需正则,通过字符串分割逻辑实现:
message_id = "7bb19406-f97a-47b3-b42c-40868d2cef5b-1661496224@example.com" result = message_id.split('@')[0].split('-').last puts result # 输出:1661496224
逻辑说明:先按@分割取前面的部分,再按-分割取最后一个元素,直接得到目标内容。
内容的提问来源于stack exchange,提问作者Imam
相关产品推荐
相关产品推荐

