如何编写正则表达式提取指定前缀与后缀之间的目标字符串
问题原因
你使用的.*属于贪婪匹配模式,会尽可能匹配最长的符合规则的字符串,因此匹配xlsm后缀时会从第一个出现的SpinTel开始,一直匹配到最后一个.xlsm结尾,将中间的pdf文件及大小描述等无关内容也包含进了匹配结果。同时你没有转义后缀前的.,会导致.被当作通配符匹配任意字符,存在匹配误差风险。
解决方案
你可以选择以下任意一种方式调整正则:
- 方法1:改用非贪婪匹配,适配多后缀同时提取
正则修改为:(?i)Spintel.*?\.(?:pdf|xlsm)
说明:.*?为非贪婪匹配,会尽可能短的匹配字符,遇到第一个符合后缀规则的位置就停止;\.转义后仅匹配点号本身;(?:pdf|xlsm)是非捕获分组,可同时匹配pdf、xlsm两种后缀,不需要同时提取的话单独写对应后缀即可,比如仅提取xlsm就用(?i)Spintel.*?\.xlsm。 - 方法2:使用排除字符类匹配,精准度更高
正则修改为:(?i)Spintel[^)]+\.(?:pdf|xlsm)
说明:[^)]+会匹配除右括号外的所有字符,刚好可以避开后面的文件大小括号内容,匹配结果更稳定。
两种方法匹配你的样例字符串,都可以准确得到SpinTel - 372464.pdf和SpinTel - 372464.xlsm两个目标结果。
内容的提问来源于stack exchange,提问作者spinanoop
相关产品推荐
相关产品推荐

